CSVTable.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. public class CSVTable : IEnumerable
  6. {
  7. /// <summary>
  8. /// 获取表名
  9. /// </summary>
  10. public string Name { get { return _name; } }
  11. private string _name;
  12. /// <summary>
  13. /// 获取表中的所有属性键
  14. /// </summary>
  15. public List<string> AtrributeKeys { get { return _atrributeKeys; } }
  16. private List<string> _atrributeKeys;
  17. /// <summary>
  18. /// 存储表中所有数据对象
  19. /// </summary>
  20. private Dictionary<string, CSVDataObject> _dataObjDic;
  21. /// <summary>
  22. /// 构造方法
  23. /// </summary>
  24. /// <param name="tableName"> 表名 </param>
  25. public CSVTable(string tableName, string[] attributeKeys)
  26. {
  27. _name = tableName;
  28. // init
  29. _atrributeKeys = new List<string>(attributeKeys);
  30. _dataObjDic = new Dictionary<string, CSVDataObject>();
  31. }
  32. /// <summary>
  33. /// 获取数据表对象的签名,用于比较是否与数据对象的签名一致
  34. /// </summary>
  35. /// <returns> 数据表对象的签名 </returns>
  36. public string GetFormat()
  37. {
  38. string format = string.Empty;
  39. foreach (string key in _atrributeKeys)
  40. {
  41. format += (key + "-");
  42. }
  43. return format;
  44. }
  45. /// <summary>
  46. /// 提供类似于键值对的访问方式便捷获取和设置数据对象
  47. /// </summary>
  48. /// <param name="key"> 数据对象主键 </param>
  49. /// <returns> 数据对象 </returns>
  50. public CSVDataObject this[string dataMajorKey]
  51. {
  52. get { return GetDataObject(dataMajorKey); }
  53. set { AddDataObject(dataMajorKey, value); }
  54. }
  55. /// <summary>
  56. /// 添加数据对象, 并将数据对象主键添加到主键集合中
  57. /// </summary>
  58. /// <param name="dataMajorKey"> 数据对象主键 </param>
  59. /// <param name="value"> 数据对象 </param>
  60. private void AddDataObject(string dataMajorKey, CSVDataObject value)
  61. {
  62. if (dataMajorKey != value.ID)
  63. {
  64. Debug.LogError("所设对象的主键值与给定主键值不同!设置失败!");
  65. return;
  66. }
  67. if (value.GetFormat() != GetFormat())
  68. {
  69. Debug.LogError("所设对象的的签名与表的签名不同!设置失败!");
  70. return;
  71. }
  72. if (_dataObjDic.ContainsKey(dataMajorKey))
  73. {
  74. Debug.LogError("表中已经存在主键为 '" + dataMajorKey + "' 的对象!设置失败!");
  75. return;
  76. }
  77. _dataObjDic.Add(dataMajorKey, value);
  78. }
  79. /// <summary>
  80. /// 通过数据对象主键获取数据对象
  81. /// </summary>
  82. /// <param name="dataMajorKey"> 数据对象主键 </param>
  83. /// <returns> 数据对象 </returns>
  84. private CSVDataObject GetDataObject(string dataMajorKey)
  85. {
  86. CSVDataObject data = null;
  87. if (_dataObjDic.ContainsKey(dataMajorKey))
  88. data = _dataObjDic[dataMajorKey];
  89. else
  90. Debug.LogError("The table not include data of this key.");
  91. return data;
  92. }
  93. /// <summary>
  94. /// 根据数据对象主键删除对应数据对象
  95. /// </summary>
  96. /// <param name="dataMajorKey"> 数据对象主键 </param>
  97. public void DeleteDataObject(string dataMajorKey)
  98. {
  99. if (_dataObjDic.ContainsKey(dataMajorKey))
  100. _dataObjDic.Remove(dataMajorKey);
  101. else
  102. Debug.LogError("The table not include the key.");
  103. }
  104. /// <summary>
  105. /// 删除所有所有数据对象
  106. /// </summary>
  107. public void DeleteAllDataObject()
  108. {
  109. _dataObjDic.Clear();
  110. }
  111. /// <summary>
  112. /// 获取数据表对象的文本内容
  113. /// </summary>
  114. /// <returns> 数据表文本内容 </returns>
  115. public string GetContent()
  116. {
  117. string content = string.Empty;
  118. foreach (string key in _atrributeKeys)
  119. {
  120. content += (key + ",").Trim();
  121. }
  122. content = content.Remove(content.Length - 1);
  123. if (_dataObjDic.Count == 0)
  124. {
  125. Debug.LogWarning("The table is empty, fuction named 'GetContent()' will just retrun key's list.");
  126. return content;
  127. }
  128. foreach (CSVDataObject data in _dataObjDic.Values)
  129. {
  130. content += "\n" + data.ID + ",";
  131. foreach (KeyValuePair<string, string> item in data)
  132. {
  133. content += (item.Value + ",").Trim();
  134. }
  135. content = content.Remove(content.Length - 1);
  136. }
  137. return content;
  138. }
  139. /// <summary>
  140. /// 迭代表中所有数据对象
  141. /// </summary>
  142. /// <returns> 数据对象 </returns>
  143. public IEnumerator GetEnumerator()
  144. {
  145. if (_dataObjDic == null)
  146. {
  147. Debug.LogWarning("The table is empty.");
  148. yield break;
  149. }
  150. foreach (var data in _dataObjDic.Values)
  151. {
  152. yield return data;
  153. }
  154. }
  155. /// <summary>
  156. /// 获得数据表内容
  157. /// </summary>
  158. /// <returns> 数据表内容 </returns>
  159. public override string ToString()
  160. {
  161. string content = string.Empty;
  162. foreach (var data in _dataObjDic.Values)
  163. {
  164. content += data.ToString() + "\n";
  165. }
  166. return content;
  167. }
  168. /// <summary>
  169. /// 通过数据表名字和数据表文本内容构造一个数据表对象
  170. /// </summary>
  171. /// <param name="tableName"> 数据表名字 </param>
  172. /// <param name="tableContent"> 数据表文本内容 </param>
  173. /// <returns> 数据表对象 </returns>
  174. public static CSVTable CreateTable(string tableName, string tableContent)
  175. {
  176. string content = tableContent.Replace("\r", "");
  177. string[] lines = content.Split('\n');
  178. if (lines.Length < 2)
  179. {
  180. Debug.LogError("The csv file is not csv table format.");
  181. return null;
  182. }
  183. string keyLine = lines[0];
  184. string[] keys = keyLine.Split(',');
  185. CSVTable table = new CSVTable(tableName, keys);
  186. for (int i = 1; i < lines.Length; i++)
  187. {
  188. string[] values = lines[i].Split(',');
  189. string major = values[0].Trim();
  190. Dictionary<string, string> tempAttributeDic = new Dictionary<string, string>();
  191. for (int j = 1; j < values.Length; j++)
  192. {
  193. string key = keys[j].Trim();
  194. string value = values[j].Trim();
  195. tempAttributeDic.Add(key, value);
  196. }
  197. CSVDataObject dataObj = new CSVDataObject(major, tempAttributeDic, keys);
  198. table[dataObj.ID] = dataObj;
  199. }
  200. return table;
  201. }
  202. }