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;
}
}