经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
C# Csv实现基本的读写和转换DataTable
来源:jb51  时间:2023/2/8 8:56:39  对本文有异议

Csv文件基本的属性

csv文件可以在excel或者wps中以表格形式打开,本质上是每一列以,逗号为分隔符的一种格式,在C#中操作可以把他当做普通txt文本读入,然后通过处理,逗号分隔符来对数据进行处理转换。
在表格中打开:

在这里插入图片描述


在记事本中打开:

在这里插入图片描述

Csv读写方式

方式一:一次性读写

使用File.ReadAllLines一次性读入。File.WriteAllLines一次性写入。
这种方式适合csv文件内容不多的情况下使用。
示例:

  1. string path="data.csv";
  2. var lines = File.ReadAllLines(path).ToList();

完整的实现:

  1. /// <summary>
  2. /// 读取Csv,返回行集合
  3. /// </summary>
  4. /// <param name="path"></param>
  5. /// <param name="hasTitle"></param>
  6. /// <returns></returns>
  7. public static List<string> ReadCsv(string path, bool hasTitle)
  8. {
  9. if (!File.Exists(path))
  10. return new List<string>();
  11. var lines = File.ReadAllLines(path).ToList();
  12. if (hasTitle)
  13. {
  14. lines.RemoveAt(0);
  15. }
  16. return lines;
  17. }

方式二:使用文件流形式读写

使用StreamReader,一行一行的读取文件中的内容,并且处理。写入类似
示例:

  1. using (StreamReader sr = new StreamReader(path))
  2. {
  3.  
  4. string line;
  5. while ((line = sr.ReadLine()) != null)
  6. {
  7. //处理行数据
  8. }
  9. }
  10.  

Csv文件读写DataTable类型

将CSV文件读入数据转成DataTable类型

  1. /// <summary>
  2. /// 读取Csv文件,加载到DataTable
  3. /// </summary>
  4. /// <param name="path">csv文件路径</param>
  5. /// <param name="hasTitle">是否有标题行</param>
  6. /// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
  7. /// <returns></returns>
  8. public static DataTable ReadCsvToDataTable(string path, bool hasTitle = false, int SafeLevel = 0)
  9. {
  10.  
  11. DataTable dt = new DataTable();
  12. var lines = ReadCsv(path, false);
  13. bool isFirst = true;
  14.  
  15. foreach (var item in lines)
  16. {
  17. string[] values = item.Split(',');
  18. if (isFirst)
  19. {
  20. for (int i = 0; i < values.Length; i++)
  21. {
  22. dt.Columns.Add();
  23. }
  24. if (hasTitle)
  25. {
  26. for (int i = 0; i < values.Length; i++)
  27. {
  28. dt.Columns[i].ColumnName = values[i];
  29. }
  30. continue;
  31. }
  32. isFirst = false;
  33. }
  34. if (values.Length == dt.Columns.Count)
  35. {
  36. dt.Rows.Add(values);
  37. }
  38. else
  39. {
  40. switch (SafeLevel)
  41. {
  42. case 0:
  43. if (values.Length > dt.Columns.Count)
  44. {
  45. var res = values.ToList();
  46. res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
  47. dt.Rows.Add(res.ToArray());
  48. }
  49. else
  50. {
  51. dt.Rows.Add(values);
  52. }
  53. break;
  54. case 1:
  55. continue;
  56. default:
  57. throw new Exception("CSV格式错误:表格各行列数不一致");
  58. }
  59.  
  60. }
  61. }
  62.  
  63.  
  64. return dt;
  65. }
  66.  
  67. /// <summary>
  68. /// 以文件流形式读取Csv文件,加载到DataTable
  69. /// </summary>
  70. /// <param name="path">csv文件路径</param>
  71. /// <param name="hasTitle">是否有标题行</param>
  72. /// <param name="SafeLevel">安全等级:0:错误格式行正常添加;1:错误行忽略(不添加),2:出现错误弹出异常</param>
  73. /// <returns></returns>
  74. /// <exception cref="Exception"></exception>
  75. public static DataTable ReadCsvByStream(string path, bool hasTitle = false, int SafeLevel = 0)
  76. {
  77. DataTable dt = new DataTable();
  78. bool isFirst = true;
  79.  
  80. using (StreamReader sr = new StreamReader(path))
  81. {
  82.  
  83. string line;
  84. while ((line = sr.ReadLine()) != null)
  85. {
  86.  
  87. string[] values = line.Split(',');
  88. if (isFirst)
  89. {
  90. for (int i = 0; i < values.Length; i++)
  91. {
  92. dt.Columns.Add();
  93. }
  94. isFirst = false;
  95. }
  96.  
  97. //有表头则添加
  98. if (hasTitle)
  99. {
  100. for (int i = 0; i < values.Length; i++)
  101. {
  102. dt.Columns[i].ColumnName = values[i];
  103. }
  104. hasTitle = false;
  105. }
  106. else
  107. {
  108. if (values.Length == dt.Columns.Count)
  109. {
  110. dt.Rows.Add(values);
  111. }
  112. else
  113. {
  114. switch (SafeLevel)
  115. {
  116. case 0:
  117. if (values.Length > dt.Columns.Count)
  118. {
  119. var res = values.ToList();
  120. res.RemoveRange(dt.Columns.Count, values.Length - dt.Columns.Count);
  121. dt.Rows.Add(res.ToArray());
  122. }
  123. else
  124. {
  125. dt.Rows.Add(values);
  126. }
  127. break;
  128. case 1:
  129. continue;
  130. default:
  131. throw new Exception("CSV格式错误:表格各行列数不一致");
  132. }
  133.  
  134. }
  135. }
  136. }
  137. }
  138.  
  139. return dt;
  140. }

将DataTable类型写入到Csv文件中去

  1. /// <summary>
  2. /// 以文件流形式将DataTable写入csv文件
  3. /// </summary>
  4. /// <param name="dt"></param>
  5. /// <param name="path"></param>
  6. /// <param name="hasTitle"></param>
  7. /// <returns></returns>
  8. public static bool WriteToCsvByDataTable(DataTable dt, string path, bool hasTitle = false)
  9. {
  10. using (StreamWriter sw = new StreamWriter(path))
  11. {
  12. //输出标题行(如果有)
  13. if (hasTitle)
  14. {
  15. for (int i = 0; i < dt.Columns.Count; i++)
  16. {
  17. sw.Write(dt.Columns[i].ColumnName);
  18. if (i != dt.Columns.Count - 1)
  19. {
  20. sw.Write(",");
  21. }
  22. }
  23. sw.WriteLine();
  24. }
  25.  
  26. //输出文件内容
  27. for (int i = 0; i < dt.Rows.Count; i++)
  28. {
  29. for (int j = 0; j < dt.Columns.Count; j++)
  30. {
  31. sw.Write(dt.Rows[i][j].ToString());
  32. if (j != dt.Columns.Count - 1)
  33. {
  34. sw.Write(",");
  35. }
  36. }
  37. sw.WriteLine();
  38. }
  39. }
  40.  
  41. return true;
  42. }
  43.  

到此这篇关于C# Csv实现基本的读写和转换DataTable的文章就介绍到这了,更多相关C# Csv读写和转换DataTable内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号