在 C# (.NET) 中处理 CSV:从简单解析到高级库
CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 .NET 生态系统中,有几种处理 CSV 的方法:从内置工具到专用库。在本文中,我们将介绍所有主要方法,展示代码示例,并帮助您为项目选择最佳工具。
1. .NET 内置工具(手动解析)
最简单的方法是使用 StreamReader 和 String.Split 类。但是,此方法不考虑字段内的引号和逗号转义,因此仅适用于没有复杂数据的简单 CSV 文件。
using System;using System.IO;using System.Linq;
public class SimpleCsvReader{ public static void ReadCsv(string filePath) { using (var reader = new StreamReader(filePath)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); // 处理行 Console.WriteLine(string.Join(" | ", values)); } } }}缺点:不处理引号,不支持多行字段,无类型化。
2. 使用 TextFieldParser(Microsoft.VisualBasic)
来自 Microsoft.VisualBasic.FileIO 命名空间的 TextFieldParser 类能够正确处理带引号和分隔符的 CSV。使用时,请添加对 Microsoft.VisualBasic 程序集的引用。
using Microsoft.VisualBasic.FileIO;using System;
public class TextFieldParserExample{ public static void ParseCsv(string filePath) { using (var parser = new TextFieldParser(filePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Console.WriteLine(string.Join(" | ", fields)); } } }}这种方法更好,但仍然需要手动将字段映射到对象。
3. CsvHelper 库——黄金标准
CsvHelper 是 .NET 中最流行的 CSV 处理库。它完全支持 RFC 4180 标准,自动映射到类,支持 LINQ 并具有高性能。
安装
dotnet add package CsvHelper将 CSV 读取到对象列表的示例
using CsvHelper;using CsvHelper.Configuration;using System.Globalization;using System.IO;using System.Linq;
public class Person{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public DateTime BirthDate { get; set; }}
public class CsvHelperReader{ public static List<Person> ReadPeople(string filePath) { using (var reader = new StreamReader(filePath)) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { return csv.GetRecords<Person>().ToList(); } }}从集合写入 CSV 的示例
public static void WritePeople(string filePath, List<Person> people){ using (var writer = new StreamWriter(filePath)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteRecords(people); }}高级配置
var config = new CsvConfiguration(CultureInfo.InvariantCulture){ HasHeaderRec