使用File.ReadAllLines可处理简单csv,但需手动处理分隔符;2. 推荐TextFieldParser应对复杂CSV,能解析引号内换行与逗号;3. CsvHelper功能强但需转换才能生成DataTable;4. 注意编码、字段数一致、内存占用及列名重复问题。

在 .net 中将 CSV 文件读取到 DataTable 是一个常见需求,尤其在处理数据导入、报表生成等场景。下面介绍几种简单有效的方法。
使用 File.ReadAllLines 和字符串处理(原生方法)
这种方法不依赖第三方库,适合结构简单的 CSV 文件。
- 读取所有行,按行分割字段
- 第一行通常作为列名
- 手动处理分隔符和引号问题(注意:复杂 CSV 可能需要额外处理)
示例代码:
using System; using System.Data; using System.IO; public DataTable ReadCsvToDataTable(String filePath) { var dt = new DataTable(); string[] lines = File.ReadAllLines(filePath); if (lines.Length == 0) return dt; // 第一行作为列名 string[] headers = lines[0].Split(','); foreach (string header in headers) { dt.Columns.Add(header); } // 添加数据行 for (int i = 1; i < lines.Length; i++) { string[] fields = lines[i].Split(','); DataRow dr = dt.NewRow(); for (int j = 0; j < fields.Length; j++) { dr[j] = fields[j]; } dt.Rows.Add(dr); } return dt; }
使用 TextFieldParser(推荐用于复杂 CSV)
.NET 提供了 microsoft.VisualBasic.FileIO.TextFieldParser,能正确处理带引号、换行的字段,是官方推荐方式。
- 支持逗号、制表符等分隔符
- 自动处理包含分隔符的文本(如 “Smith, John”)
- 需添加对 Microsoft.VisualBasic 的引用(.NET Core/.NET 5+ 默认可用)
示例代码:
using System.Data; using Microsoft.VisualBasic.FileIO; public DataTable ReadCsvWithTextFieldParser(string filePath) { var dt = new DataTable(); using (var parser = new TextFieldParser(filePath)) { parser.Delimiters = new string[] { "," }; parser.HasFieldsEnclosedInQuotes = true; // 读取标题行 if (!parser.EndOfData) { string[] headers = parser.ReadFields(); foreach (string header in headers) { dt.Columns.Add(header); } } // 读取数据行 while (!parser.EndOfData) { string[] fields = parser.ReadFields(); DataRow dr = dt.NewRow(); for (int i = 0; i < fields.Length; i++) { dr[i] = fields[i]; } dt.Rows.Add(dr); } } return dt; }
使用第三方库:CsvHelper(功能强大)
如果你需要更高性能或映射到对象,CsvHelper 是优秀选择。
基本思路:先读为 List<Dictionary<string, Object>>,再转 DataTable。
注意事项
实际使用中注意以下几点:
基本上就这些。根据项目需求选择合适方式,小项目用 TextFieldParser 最稳妥。