CsvWriter.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace Game.Config
  5. {
  6. public class CsvWriter<T> where T : GameData
  7. {
  8. private StringBuilder data;
  9. private string name;
  10. private string path;
  11. public string Data { get => data.ToString(); }
  12. public CsvWriter(string wpath,string fname,List<T> datas, GameDataFormatInfo dataFormatInfo = null)
  13. {
  14. data = new StringBuilder();
  15. name = fname;
  16. path = wpath;
  17. GameDataToString (datas,dataFormatInfo);
  18. }
  19. private void GameDataToString(List<T> datas, GameDataFormatInfo dataFormatInfo)
  20. {
  21. //Type type = Type.GetType($"Game.Config.{name}");
  22. Type type = typeof(T);
  23. GameDataFormatInfo info = dataFormatInfo;
  24. if (info == null)
  25. info = null;//GameDatabase.Instance.GetGameDataFormatInfo(name);
  26. if (info == null) { return; }
  27. data.Append(ToCsvLine(info.Fileds));
  28. data.Append(ToCsvLine(info.Types));
  29. foreach (GameData gd in datas)
  30. {
  31. string[] linedatas = ExcelParser.Deserialize(type, gd,info.Fileds);
  32. string line = ToCsvLine(linedatas);
  33. data.Append(line);
  34. }
  35. }
  36. public void Write(Action callback = null)
  37. {
  38. //FileHelper.WirteStringToFileAsync(path, data.ToString(), callback);
  39. FileHelper.WirteStringToFile(path, data.ToString());
  40. }
  41. public static string ToCsvLine(string[] datas)
  42. {
  43. StringBuilder sb = new StringBuilder();
  44. int length = datas.Length;
  45. int end = length-1;
  46. for (int i = 0; i < length; i++)
  47. {
  48. string str = datas[i];
  49. if (str.IndexOf(',') >= 0)
  50. {
  51. str = FileHelper.AddHeadandTailChar(str, '"');
  52. }
  53. if (i < end)
  54. {
  55. sb.Append($"{str},");
  56. }
  57. else
  58. {
  59. sb.Append($"{str}\r\n");
  60. }
  61. }
  62. return sb.ToString();
  63. }
  64. }
  65. }