CsvReader.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using UnityEngine;
  8. using UnityEngine.UI;
  9. namespace Game.Config
  10. {
  11. public class CsvReader
  12. {
  13. private List<string[]> rowDatas;
  14. private Dictionary<string, int> fieldKey;
  15. private string path;
  16. private Encoding encoding;
  17. private bool isgb2312;
  18. private int fieldLine;
  19. private int typeLine;
  20. private int startLine;
  21. public string Name;
  22. public int StartLine { get { return startLine; } set { startLine = value; } }
  23. public CsvReader(string csvpath, int fl = 0,int tl = 1 ,int sl = 2,Encoding edg = null)
  24. {
  25. if (string.IsNullOrEmpty(csvpath))
  26. {
  27. throw new ArgumentNullException("path");
  28. }
  29. fieldLine = fl;
  30. typeLine = tl;
  31. startLine = sl;
  32. rowDatas = new List<string[]>();
  33. fieldKey = new Dictionary<string, int>();
  34. encoding = edg;
  35. path = csvpath;
  36. if (edg == null)
  37. {
  38. encoding = Encoding.UTF8;
  39. isgb2312 = false;
  40. }
  41. else if (edg != Encoding.UTF8)
  42. {
  43. isgb2312 = true;
  44. }
  45. Name =FileHelper.GetName(path);
  46. ReadFromCsv();
  47. InitFieldKey();
  48. }
  49. /// <summary>
  50. ///
  51. /// </summary>
  52. /// <param name="name"></param>
  53. /// <param name="bytes"></param>
  54. /// <param name="fl">字段名</param>
  55. /// <param name="tl">类型名</param>
  56. /// <param name="sl">多少行开始</param>
  57. public CsvReader(string name,byte[] bytes,int fl = 0, int tl = 1, int sl = 2)
  58. {
  59. fieldLine = fl;
  60. typeLine = tl;
  61. startLine = sl;
  62. rowDatas = new List<string[]>();
  63. fieldKey = new Dictionary<string, int>();
  64. isgb2312 = false;
  65. Name = name;
  66. ReadFromMemory(bytes);
  67. InitFieldKey();
  68. }
  69. public string[][] RowDatas
  70. {
  71. get
  72. {
  73. return rowDatas.ToArray();
  74. }
  75. }
  76. public string[] Fields()
  77. {
  78. return rowDatas[fieldLine];
  79. }
  80. public string GetDataByFieldName(string fieldName,int line)
  81. {
  82. string ret = "";
  83. if (fieldKey.ContainsKey(fieldName) && rowDatas.Count > line)
  84. {
  85. ret = rowDatas[line][fieldKey[fieldName]];
  86. }
  87. return ret;
  88. }
  89. public void SetDataByFieldName(string fieldName, string value,int line)
  90. {
  91. if (fieldKey.ContainsKey(fieldName) && rowDatas.Count > line)
  92. {
  93. rowDatas[line][fieldKey[fieldName]] = value;
  94. }
  95. }
  96. public bool HasField(string fieldName)
  97. {
  98. return fieldKey.ContainsKey(fieldName);
  99. }
  100. public string[] Types()
  101. {
  102. return rowDatas[typeLine];
  103. }
  104. public string GetString()
  105. {
  106. StringBuilder stringBuilder = new StringBuilder();
  107. for (int i = 0; i < rowDatas.Count; i++)
  108. {
  109. stringBuilder.Append(CsvWriter<GameData>.ToCsvLine(rowDatas[i]));
  110. }
  111. return stringBuilder.ToString();
  112. }
  113. private void ReadFromCsv()//改异步
  114. {
  115. string[] datas = File.ReadAllLines(path, encoding);
  116. if (datas == null || datas.Length <= 0)
  117. {
  118. return;
  119. }
  120. if (isgb2312)
  121. {
  122. for (int i = 0; i < datas.Length; i++)
  123. {
  124. datas[i] = FileHelper.GB2312ToUTF8(datas[i]);
  125. }
  126. }
  127. foreach (var item in datas)
  128. {
  129. string[] rdt = FileHelper.SpiltData(item);
  130. rowDatas.Add(rdt);
  131. }
  132. }
  133. private void ReadFromMemory(byte[] bytes)
  134. {
  135. string str = Encoding.UTF8.GetString(bytes);
  136. string[] datas = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
  137. foreach (var item in datas)
  138. {
  139. string[] rdt = FileHelper.SpiltData(item);
  140. rowDatas.Add(rdt);
  141. }
  142. }
  143. private void InitFieldKey()
  144. {
  145. string[] fields = rowDatas[fieldLine];
  146. for (int i = 0; i < fields.Length; i++)
  147. {
  148. if (fieldKey.ContainsKey(fields[i]))
  149. {
  150. Debug.Log($"Field 重复 :{fields[i]} , i = {i}");
  151. continue;
  152. }
  153. fieldKey.Add(fields[i],i);
  154. }
  155. }
  156. }
  157. }