CsvReader.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. public CsvReader(string name,byte[] bytes,int fl = 0, int tl = 1, int sl = 2)
  50. {
  51. fieldLine = fl;
  52. typeLine = tl;
  53. startLine = sl;
  54. rowDatas = new List<string[]>();
  55. fieldKey = new Dictionary<string, int>();
  56. isgb2312 = false;
  57. Name = name;
  58. ReadFromMemory(bytes);
  59. InitFieldKey();
  60. }
  61. public string[][] RowDatas
  62. {
  63. get
  64. {
  65. return rowDatas.ToArray();
  66. }
  67. }
  68. public string[] Fields()
  69. {
  70. return rowDatas[fieldLine];
  71. }
  72. public string GetDataByFieldName(string fieldName,int line)
  73. {
  74. string ret = "";
  75. if (fieldKey.ContainsKey(fieldName) && rowDatas.Count > line)
  76. {
  77. ret = rowDatas[line][fieldKey[fieldName]];
  78. }
  79. return ret;
  80. }
  81. public void SetDataByFieldName(string fieldName, string value,int line)
  82. {
  83. if (fieldKey.ContainsKey(fieldName) && rowDatas.Count > line)
  84. {
  85. rowDatas[line][fieldKey[fieldName]] = value;
  86. }
  87. }
  88. public bool HasField(string fieldName)
  89. {
  90. return fieldKey.ContainsKey(fieldName);
  91. }
  92. public string[] Types()
  93. {
  94. return rowDatas[typeLine];
  95. }
  96. public string GetString()
  97. {
  98. StringBuilder stringBuilder = new StringBuilder();
  99. for (int i = 0; i < rowDatas.Count; i++)
  100. {
  101. stringBuilder.Append(CsvWriter<GameData>.ToCsvLine(rowDatas[i]));
  102. }
  103. return stringBuilder.ToString();
  104. }
  105. private void ReadFromCsv()//改异步
  106. {
  107. string[] datas = File.ReadAllLines(path, encoding);
  108. if (datas == null || datas.Length <= 0)
  109. {
  110. return;
  111. }
  112. if (isgb2312)
  113. {
  114. for (int i = 0; i < datas.Length; i++)
  115. {
  116. datas[i] = FileHelper.GB2312ToUTF8(datas[i]);
  117. }
  118. }
  119. foreach (var item in datas)
  120. {
  121. string[] rdt = FileHelper.SpiltData(item);
  122. rowDatas.Add(rdt);
  123. }
  124. }
  125. private void ReadFromMemory(byte[] bytes)
  126. {
  127. string str = Encoding.UTF8.GetString(bytes);
  128. string[] datas = str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
  129. foreach (var item in datas)
  130. {
  131. string[] rdt = FileHelper.SpiltData(item);
  132. rowDatas.Add(rdt);
  133. }
  134. }
  135. private void InitFieldKey()
  136. {
  137. string[] fields = rowDatas[fieldLine];
  138. for (int i = 0; i < fields.Length; i++)
  139. {
  140. if (fieldKey.ContainsKey(fields[i]))
  141. {
  142. Debug.Log($"Field 重复 :{fields[i]} , i = {i}");
  143. continue;
  144. }
  145. fieldKey.Add(fields[i],i);
  146. }
  147. }
  148. }
  149. }