[Unity3D·CSV篇]03.CSV初级缓存

既然数据对象都有了,要缓存起来,真是太简单了,新建一个专门缓存CSV文件对象的类:

 
 
  1. public class CsvDataCached_Newer
  2. {
  3.     /// <summary>
  4.     /// CSVDemo.csv文件缓存对象
  5.     /// </summary>
  6.     public static Dictionary<int, CSVDemo> csvDemoDatas = null;
  7.     static CsvDataCached_Newer()
  8.     {
  9.         /* 缓存CSV文件对象 */
  10.         csvDemoDatas = LoadCsvData<CSVDemo>(Application.streamingAssetsPath + "/CSVDemo.csv");
  11.     }
  12.     /// <summary>
  13.     /// 读取CSV文件数据(利用反射)
  14.     /// </summary>
  15.     /// <typeparam name="CsvData">CSV数据对象的类型</typeparam>
  16.     /// <param name="csvFilePath">CSV文件路径</param>
  17.     /// <param name="csvDatas">用于缓存数据的字典</param>
  18.     /// <returns>CSV文件所有行内容的数据对象</returns>
  19.     private static Dictionary<int, T_CsvData> LoadCsvData<T_CsvData>(string csvFilePath)
  20.     {
  21.         Dictionary<int, T_CsvData> dic = new Dictionary<int, T_CsvData>();
  22.         /* 从CSV文件读取数据 */
  23.         Dictionary<string, Dictionary<stringstring>> result = LoadCsvFile(csvFilePath);
  24.         /* 遍历每一行数据 */
  25.         foreach (string ID in result.Keys)
  26.         {
  27.             /* CSV的一行数据 */
  28.             Dictionary<stringstring> datas = result[ID];
  29.             /* 读取Csv数据对象的属性 */
  30.             PropertyInfo[] props = typeof(T_CsvData).GetProperties();
  31.             /* 使用反射,将CSV文件的数据赋值给CSV数据对象的相应字段,要求CSV文件的字段名和CSV数据对象的字段名完全相同 */
  32.             T_CsvData obj = Activator.CreateInstance<T_CsvData>();
  33.             foreach (PropertyInfo pi in props)
  34.             {
  35.                 pi.SetValue(obj, Convert.ChangeType(datas[pi.Name], pi.PropertyType)null);
  36.             }
  37.             /* 按ID-数据的形式存储 */
  38.             dic[Convert.ToInt32(ID)] = obj;
  39.         }
  40.         return dic;
  41.     }
  42.     /// <summary>
  43.     /// 读取CSV文件
  44.     /// 结果保存到字典集合,以ID作为Key值,对应每一行的数据,每一行的数据也用字典集合保存。
  45.     /// </summary>
  46.     /// <param name="filePath"></param>
  47.     /// <returns></returns>
  48.     public static Dictionary<string, Dictionary<stringstring>> LoadCsvFile(string filePath)
  49.     {
  50.         Dictionary<string, Dictionary<stringstring>> result = new Dictionary<string, Dictionary<stringstring>>();
  51.         string[] fileData = File.ReadAllLines(filePath);
  52.         if (fileData.Length < 2)
  53.         {
  54.             return result;
  55.         }
  56.         /* CSV文件的第一行为Key字段,第二行开始是数据。第一个字段一定是ID。 */
  57.         string[] keys = fileData[0].Split(',');
  58.         for (int i = 1; i < fileData.Length; i++)
  59.         {
  60.             string[] line = fileData[i].Split(',');
  61.             /* 以ID为key值,创建一个新的集合,用于保存当前行的数据 */
  62.             string ID = line[0];
  63.             result[ID] = new Dictionary<stringstring>();
  64.             for (int j = 0; j < line.Length; j++)
  65.             {
  66.                 /* 每一行的数据存储规则:Key字段-Value值 */
  67.                 result[ID][keys[j]] = line[j];
  68.             }
  69.         }
  70.         return result;
  71.     }
  72. }
不要紧张,上面两个看起来很复杂的函数,是之前的那两个,我只是把它们移到了这个类里,并且变成了静态函数。
重点要关注的是前面两段代码:
  
  
  1.     /// <summary>
  2.     /// CSVDemo.csv文件缓存对象
  3.     /// </summary>
  4.     public static Dictionary<int, CSVDemo> csvDemoDatas = null;
  5.     static CsvDataCached_Newer()
  6.     {
  7.         /* 缓存CSV文件对象 */
  8.         csvDemoDatas = LoadCsvData<CSVDemo>(Application.streamingAssetsPath + "/CSVDemo.csv");
  9.     }
csvDemoDatas属性用于缓存CSVDemo文件对象,而静态构造器用于初始化这个属性。
有多少个CSV文件类型,就写多少个这样的属性。
于是,获取CSV文件对象的方式就变得很简单:
 
 
  1.         /* 测试读取ID为2的数据 */
  2.         CSVDemo csvDemo2 = CsvDataCached_Newer.csvDemoDatas[2];
  3.         Debug.Log("ID=" + csvDemo2.ID + ",Name=" + csvDemo2.Name);
测试结果是一样的:

 其实这种缓存的方式已经不错了,接下来木头要介绍的高级缓存方式并不会比这种简单的方式方便多少。
只是,我不希望每次新增一个CSV文件,就增加一个新的属性。
所以,下一篇的高级缓存方式,大家可以不认可。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值