在 C# (.NET) 中处理 CSV:完整指南
CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 C# (.NET) 生态系统中,有多种处理 CSV 文件的方法:从手动解析到使用强大的第三方库。在本文中,我们将介绍在 .NET 中读取、写入和处理 CSV 数据的所有主要方法。
1. 使用 StreamReader 手动解析 CSV
最简单的方法是使用标准类 StreamReader 和 String.Split。但这种方法无法处理复杂情况(引号、数据内的逗号、换行符)。
using System;using System.IO;using System.Linq;
public class CsvSimpleReader{ public 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. 使用 Microsoft.VisualBasic.FileIO.TextFieldParser(适用于 .NET Framework)
在 .NET Framework 中有一个内置的 CSV 解析器——TextFieldParser。它可以正确处理引号和分隔符。
using Microsoft.VisualBasic.FileIO;using System;using System.IO;
public class CsvTextFieldParser{ public void ParseCsv(string filePath) { using (var parser = new TextFieldParser(filePath)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(",");
while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Console.WriteLine(string.Join(" | ", fields)); } } }}重要提示:在 .NET Core / .NET 5+ 中,此类可通过 Microsoft.VisualBasic 包(NuGet)获得。
3. CsvHelper 库(推荐方式)
CsvHelper 是 .NET 中最流行的 CSV 处理库。它支持映射到类、LINQ 查询、分隔符和编码配置。
通过 NuGet 安装:
Install-Package CsvHelper3.1 将 CSV 读取到对象列表
using System.Globalization;using CsvHelper;using CsvHelper.Configuration;using System.IO;using System.Linq;using System.Collections.Generic;
public class Person{ public string Name { get; set; } public int Age { get; set; } public string Email { get; set; }}
public void ReadCsvWithCsvHelper(string filePath){ var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, Delimiter = ",", MissingFieldFound = null };
using (var reader = new StreamReader(filePath)) using (var csv = new CsvReader(reader, config)) { var records = csv.GetRecords<Person>().ToList(); foreach (var person in records) { Console.WriteLine($"{person.Name}, {person.Age}, {person.Email}"); } }}3.2 从对象集合写入 CSV
public void WriteCsvWithCsvHelper(string filePath, List<Person> people){ using (var writer = new StreamWriter(filePath)) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteRecords(people); }}3.3 手动管理字段(无映射)
public void ManualCsvWrite(string filePath){ using (var writer = new StreamWriter(filePath)) using (va