CsvReader.cs 4.4 KB

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