using JetBrains.Annotations; using LitJson; using Newtonsoft.Json.Serialization; using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net.Mime; using System.Reflection; using UnityEngine; using yutokun; using static UnityEngine.Rendering.DebugUI; public class CSVReader { private static Dictionary m_KeyMapping = new Dictionary(); private static List> m_Rows = new List>(); /// /// 解析csv表格,并返回列表 /// /// /// /// public static List Read(string content) where T : new() { List result = new List(); Read(result, content); return result; } /// /// 解析csv表格,并返回数量 /// /// /// /// public static int Read(List target, string content) where T : new() { m_KeyMapping.Clear(); m_Rows.Clear(); m_Rows = CSVParser.LoadFromString(content); // 第一行是key List keys = m_Rows[0]; for (int i = 0; i < keys.Count; ++i) { m_KeyMapping.Add(keys[i], i); } int count = 0; Type type = typeof(T); for (int i = 1; i < m_Rows.Count; ++i) { if (m_Rows[i] == null || m_Rows[i].Count == 0) // 空行 continue; bool isBlank = true; m_Rows[i].ForEach(s => { if (!string.IsNullOrEmpty(s)) isBlank = false; }); if (isBlank) continue; if (m_Rows[i][0].Length > 0 && m_Rows[i][0][0] == '#') // 注释 continue; List row = m_Rows[i]; T obj = new T(); foreach (var key in m_KeyMapping) { int index = key.Value; var fieldInfo = type.GetField(key.Key); if (fieldInfo != null) { Type fieldType = fieldInfo.FieldType; if (fieldType.IsEnum) // 如果是枚举,先转成int { int value = int.Parse(row[index]); fieldInfo.SetValue(obj, value); } else { fieldInfo.SetValue(obj, Convert.ChangeType(row[index], fieldInfo.FieldType)); } } } target.Add(obj); count++; } return count; } /// /// 解析csv表格,并按key存储到字典里,返回数量 /// /// /// /// /// /// /// public static int ReadDictionary(Dictionary target, string content, string keyName) where TValue : new() { List data = CSVReader.Read(content); if (data == null || data.Count == 0) return 0; Type type_key = typeof(TKey); Type type_value = typeof(TValue); FieldInfo field = type_value.GetField(keyName); Type type_field = field.FieldType; int count = 0; for (int i = 0; i < data.Count; ++i) { TValue d = data[i]; TKey key = default(TKey); if (type_key.IsEnum) { if(type_field == typeof(string)) { key = (TKey)Enum.Parse(type_key, field.GetValue(d).ToString()); } else if(type_field == typeof(int)) { key = (TKey)field.GetValue(d); } } else { key = (TKey)field.GetValue(d); } if (key == null) { LogHelper.LogError("CSVReader.ReadDictionary(): key is null"); continue; } target.Add(key, d); count++; } return count; } }