[Unity3D·CSV篇]03.CSV初級快取
阿新 • • 發佈:2019-02-05
既然資料物件都有了,要快取起來,真是太簡單了,新建一個專門快取CSV檔案物件的類:
- public class CsvDataCached_Newer
- {
- /// <summary>
- /// CSVDemo.csv檔案快取物件
- /// </summary>
- public static Dictionary<int, CSVDemo> csvDemoDatas = null;
- static CsvDataCached_Newer()
- {
- /* 快取CSV檔案物件 */
- csvDemoDatas = LoadCsvData<
- }
- /// <summary>
- /// 讀取CSV檔案資料(利用反射)
- /// </summary>
- /// <typeparam name="CsvData">CSV資料物件的型別</typeparam>
- /// <param name="csvFilePath">CSV檔案路徑</param>
- /// <param name="csvDatas">用於快取資料的字典</param>
- /// <returns>CSV檔案所有行內容的資料物件</returns>
- private static Dictionary<int, T_CsvData> LoadCsvData<T_CsvData>(string csvFilePath)
- {
- Dictionary<int, T_CsvData> dic = new Dictionary<int, T_CsvData>();
- /* 從CSV檔案讀取資料 */
- Dictionary<string, Dictionary<
- /* 遍歷每一行資料 */
- foreach (string ID in result.Keys)
- {
- /* CSV的一行資料 */
- Dictionary<string, string> datas = result[ID];
- /* 讀取Csv資料物件的屬性 */
- PropertyInfo[] props = typeof(T_CsvData).GetProperties();
- /* 使用反射,將CSV檔案的資料賦值給CSV資料物件的相應欄位,要求CSV檔案的欄位名和CSV資料物件的欄位名完全相同 */
- T_CsvData obj = Activator.CreateInstance<T_CsvData>();
- foreach (PropertyInfo pi in props)
- {
- pi.SetValue(obj, Convert.ChangeType(datas[pi.Name], pi.PropertyType), null);
- }
- /* 按ID-資料的形式儲存 */
- dic[Convert.ToInt32(ID)] = obj;
- }
- return dic;
- }
- /// <summary>
- /// 讀取CSV檔案
- /// 結果儲存到字典集合,以ID作為Key值,對應每一行的資料,每一行的資料也用字典集合儲存。
- /// </summary>
- /// <param name="filePath"></param>
- /// <returns></returns>
- public static Dictionary<string, Dictionary<string, string>> LoadCsvFile(string filePath)
- {
- Dictionary<string, Dictionary<string, string>> result = new Dictionary<string, Dictionary<string, string>>();
- string[] fileData = File.ReadAllLines(filePath);
- if (fileData.Length < 2)
- {
- return result;
- }
- /* CSV檔案的第一行為Key欄位,第二行開始是資料。第一個欄位一定是ID。 */
- string[] keys = fileData[0].Split(',');
- for (int i = 1; i < fileData.Length; i++)
- {
- string[] line = fileData[i].Split(',');
- /* 以ID為key值,建立一個新的集合,用於儲存當前行的資料 */
- string ID = line[0];
- result[ID] = new Dictionary<string, string>();
- for (int j = 0; j < line.Length; j++)
- {
- /* 每一行的資料儲存規則:Key欄位-Value值 */
- result[ID][keys[j]] = line[j];
- }
- }
- return result;
- }
- }
- /// <summary>
- /// CSVDemo.csv檔案快取物件
- /// </summary>
- public static Dictionary<int, CSVDemo> csvDemoDatas = null;
- static CsvDataCached_Newer()
- {
- /* 快取CSV檔案物件 */
- csvDemoDatas = LoadCsvData<CSVDemo>(Application.streamingAssetsPath + "/CSVDemo.csv");
- }
- /* 測試讀取ID為2的資料 */
- CSVDemo csvDemo2 = CsvDataCached_Newer.csvDemoDatas[2];
- Debug.Log("ID=" + csvDemo2.ID + ",Name=" + csvDemo2.Name);