CsvHelper
是一个用于处理 CSV 文件的 .NET 库,能够简化 CSV 文件的读写操作,尤其是在处理复杂的数据结构时。支持快速、灵活且易于使用的读取和写入操作,并且完全免费用于商业用途。
1. 安装
第一步,老规矩,先安装
dotnet add package CsvHelper
2. 基本用法
写入 CSV 文件
using CsvHelper;
using CsvHelper.Configuration;
using System.Globalization;
using System.IO;
using System.Collections.Generic;public class Person
{public string Name { get; set; }public int Age { get; set; }
}public void WriteCsv()
{var records = new List<Person>{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 }};var config = new CsvConfiguration(CultureInfo.InvariantCulture){HasHeaderRecord = true, // 写入头部};using (var writer = new StreamWriter("people.csv"))using (var csv = new CsvWriter(writer, config)){csv.WriteRecords(records);}
}
WriteRecords()
方法将List<T>
数据写入到 CSV 文件中。HasHeaderRecord = true
表示写入列名。
2.1 读取 CSV 文件
使用 CsvReader
类可以轻松读取 CSV 文件并将其映射为 C# 对象。
using CsvHelper;
using CsvHelper.Configuration;
using System.Globalization;
using System.IO;
using System.Linq;public class Person
{public string Name { get; set; }public int Age { get; set; }
}public void ReadCsv()
{var config = new CsvConfiguration(CultureInfo.InvariantCulture){HasHeaderRecord = true, // CSV 文件是否包含头部};using (var reader = new StreamReader("people.csv"))using (var csv = new CsvReader(reader, config)){var records = csv.GetRecords<Person>().ToList();foreach (var record in records){Console.WriteLine($"Name: {record.Name}, Age: {record.Age}");}}
}
//读取索引头
public class Foo
{[Index(0)]public int age { get; set; }[Index(1)]public string Name { get; set; }
}
//指定名称
public class Foo
{[Name("id")]public int Id { get; set; }[Name("name")]public string Name { get; set; }
}
3. 配置选项
CsvHelper
提供了多种配置选项,可以通过 CsvConfiguration
类进行自定义:
- 分隔符:如果 CSV 文件的分隔符是其他字符,可以设置
Delimiter
属性。 - 忽略空白行:
IgnoreBlankLines = true
,可以忽略文件中的空白行。 - 自动映射:
csv.AutoMap()
方法可以让CsvHelper
自动映射列名和类的属性。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{Delimiter = ";", // 使用分号作为分隔符IgnoreBlankLines = true, // 忽略空白行
};
4. 自定义映射
如果需要控制 CSV 列和类属性之间的映射关系,可以实现自定义映射类。
using CsvHelper.Configuration;public class PersonMap : ClassMap<Person>
{public PersonMap(){Map(m => m.Name).Name("Full Name"); // 将 "Full Name" 列映射到 Name 属性Map(m => m.Age).Name("Years Old"); // 将 "Years Old" 列映射到 Age 属性}
}public void ReadCsvWithMap()
{var config = new CsvConfiguration(CultureInfo.InvariantCulture){HasHeaderRecord = true,};using (var reader = new StreamReader("people.csv"))using (var csv = new CsvReader(reader, config)){csv.Context.RegisterClassMap<PersonMap>(); // 注册映射类var records = csv.GetRecords<Person>().ToList();foreach (var record in records){Console.WriteLine($"Name: {record.Name}, Age: {record.Age}");}}
}
5. 错误处理
CsvHelper
提供了异常处理机制来处理 CSV 文件中的错误。
try
{using (var reader = new StreamReader("people.csv"))using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture))){var records = csv.GetRecords<Person>().ToList();}
}
catch (CsvHelperException ex)
{Console.WriteLine($"Error reading CSV file: {ex.Message}");
}
6. 总结
CsvHelper
是一个功能强大的库,提供了多种方式来读取和写入 CSV 文件。通过配置和自定义映射,可以轻松地处理不同格式的 CSV 文件。如果需要进行复杂的数据转换,CsvHelper
也能够满足需求。