KeyValueTableCsvParser.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.IO;
  5. namespace etoy
  6. {
  7. // KeyValue表结构
  8. // * 0 1 2 3 4
  9. // 0 key value type description tag
  10. // 1 AAA 0 int des1 c
  11. // 2 BBB 111 int des2
  12. // 3 CCC Hello string des3 s
  13. // 4 DDD <Json> string des4
  14. // * type 目前仅支持 int & string
  15. sealed class KeyValueTableCsvParser
  16. {
  17. const int START_ROW = 1;
  18. public KeyValueTable Parse(DataTable dt, string file)
  19. {
  20. int rowCount = dt.Rows.Count;
  21. int colCount = dt.Columns.Count;
  22. if (rowCount <= 0 || colCount < 5)
  23. throw new Exception($"KeyValue表结构不合法, Row: {rowCount}, Column: {colCount}");
  24. var row0 = dt.Rows[0];
  25. string key = row0[0].ToString().ToFieldType();
  26. string value = row0[1].ToString().ToFieldType();
  27. string type = row0[2].ToString().ToFieldType();
  28. string description = row0[3].ToString().ToFieldType();
  29. string tag = row0[4].ToString().ToFieldType();
  30. if (key != nameof(key) ||
  31. value != nameof(value) ||
  32. type != nameof(type) ||
  33. description != nameof(description) ||
  34. tag != nameof(tag))
  35. throw new Exception();
  36. var rows = new List<KeyValueRow>(rowCount);
  37. for (int i = START_ROW; i < rowCount; ++i)
  38. {
  39. var row = dt.Rows[i];
  40. if (string.IsNullOrEmpty(row[0] as string)) // key为empty,不处理此行
  41. continue;
  42. var keyValueRow = new KeyValueRow();
  43. keyValueRow.Row = i;
  44. for (int j = 0; j < colCount; ++j)
  45. {
  46. var cellvalue = row[j].ToString().ToCellValue();
  47. var keyValueType = (KeyValueColumn)j;
  48. switch (keyValueType)
  49. {
  50. case KeyValueColumn.Key:
  51. keyValueRow.Key = cellvalue;
  52. break;
  53. case KeyValueColumn.Value:
  54. keyValueRow.Value = cellvalue;
  55. break;
  56. case KeyValueColumn.Type:
  57. keyValueRow.Type = cellvalue;
  58. break;
  59. case KeyValueColumn.Description:
  60. keyValueRow.Description = cellvalue;
  61. break;
  62. case KeyValueColumn.Tag:
  63. keyValueRow.Tag = cellvalue?.ToLower() ?? string.Empty;
  64. break;
  65. default:
  66. throw new Exception();
  67. }
  68. }
  69. rows.Add(keyValueRow);
  70. }
  71. var table = new KeyValueTable();
  72. table.Name = Path.GetFileNameWithoutExtension(file).ToTableName();
  73. table.Path = file;
  74. table.Rows = rows.ToArray();
  75. return table;
  76. }
  77. }
  78. }