CsvHelper
是一个用于处理 CSV 文件的 .NET 库,能够简化 CSV 文件的读写操作,尤其是在处理复杂的数据结构时。支持快速、灵活且易于使用的读取和写入操作,并且完全免费用于商业用途。
1. 安装
第一步,老规矩,先安装
bash
dotnet add package CsvHelper
2. 基本用法
写入 CSV 文件
csharp
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# 对象。
csharp
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
自动映射列名和类的属性。
csharp
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ";", // 使用分号作为分隔符
IgnoreBlankLines = true, // 忽略空白行
};
4. 自定义映射
如果需要控制 CSV 列和类属性之间的映射关系,可以实现自定义映射类。
csharp
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 文件中的错误。
csharp
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
也能够满足需求。
7. 资源链接
