using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.UI; namespace Game.Config { public class CsvReader { private List rowDatas; private Dictionary fieldKey; private string path; private Encoding encoding; private bool isgb2312; private int fieldLine; private int typeLine; private int startLine; public string Name; public int StartLine { get { return startLine; } set { startLine = value; } } public CsvReader(string csvpath, int fl = 0,int tl = 1 ,int sl = 2,Encoding edg = null) { if (string.IsNullOrEmpty(csvpath)) { throw new ArgumentNullException("path"); } fieldLine = fl; typeLine = tl; startLine = sl; rowDatas = new List(); fieldKey = new Dictionary(); encoding = edg; path = csvpath; if (edg == null) { encoding = Encoding.UTF8; isgb2312 = false; } else if (edg != Encoding.UTF8) { isgb2312 = true; } Name =FileHelper.GetName(path); ReadFromCsv(); InitFieldKey(); } /// /// /// /// /// /// 字段名 /// 类型名 /// 多少行开始 public CsvReader(string name,byte[] bytes,int fl = 0, int tl = 1, int sl = 2) { fieldLine = fl; typeLine = tl; startLine = sl; rowDatas = new List(); fieldKey = new Dictionary(); isgb2312 = false; Name = name; ReadFromMemory(bytes); InitFieldKey(); } public string[][] RowDatas { get { return rowDatas.ToArray(); } } public string[] Fields() { return rowDatas[fieldLine]; } public string GetDataByFieldName(string fieldName,int line) { string ret = ""; if (fieldKey.ContainsKey(fieldName) && rowDatas.Count > line) { ret = rowDatas[line][fieldKey[fieldName]]; } return ret; } public void SetDataByFieldName(string fieldName, string value,int line) { if (fieldKey.ContainsKey(fieldName) && rowDatas.Count > line) { rowDatas[line][fieldKey[fieldName]] = value; } } public bool HasField(string fieldName) { return fieldKey.ContainsKey(fieldName); } public string[] Types() { return rowDatas[typeLine]; } public string GetString() { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < rowDatas.Count; i++) { stringBuilder.Append(CsvWriter.ToCsvLine(rowDatas[i])); } return stringBuilder.ToString(); } private void ReadFromCsv()//改异步 { string[] datas = File.ReadAllLines(path, encoding); if (datas == null || datas.Length <= 0) { return; } if (isgb2312) { for (int i = 0; i < datas.Length; i++) { datas[i] = FileHelper.GB2312ToUTF8(datas[i]); } } foreach (var item in datas) { string[] rdt = FileHelper.SpiltData(item); rowDatas.Add(rdt); } } private void ReadFromMemory(byte[] bytes) { string str = Encoding.UTF8.GetString(bytes); string[] datas = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (var item in datas) { string[] rdt = FileHelper.SpiltData(item); rowDatas.Add(rdt); } } private void InitFieldKey() { string[] fields = rowDatas[fieldLine]; for (int i = 0; i < fields.Length; i++) { if (fieldKey.ContainsKey(fields[i])) { Debug.Log($"Field 重复 :{fields[i]} , i = {i}"); continue; } fieldKey.Add(fields[i],i); } } } }