LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C#.NET使用CsvHelper快速读取和写入CSV文件

admin
2024年12月25日 12:26 本文热度 164

引言 

在.NET开发过程中,我们常常需要处理CSV文件,进行数据的导入、导出和交换。CSV文件因其结构简单、易于阅读和编辑而被广泛使用。然而,手动读写CSV文件可能会遇到各种问题,如分隔符处理、数据类型转换等。幸运的是,有一个强大的开源库——CsvHelper,它能够帮助我们快速、高效地读取和写入CSV文件。本文将详细介绍CsvHelper的安装、使用方法以及一些高级特性,让你在.NET项目中轻松处理CSV数据。

CsvHelper简介 

CsvHelper是一个.NET开源、快速、灵活、高度可配置、易于使用的用于读取和写入CSV文件的类库。它建立在.NET Standard 2.0之上,几乎可以在任何地方运行。CsvHelper支持读写自定义类对象,具有自动类型转换、自定义类型转换器和灵活的映射选项等功能。

安装CsvHelper 

要使用CsvHelper,首先需要将其安装到项目中。可以通过NuGet包管理器来安装:

  • 使用包管理器控制台:
    Install-Package CsvHelper
  • 使用.NET CLI:
    dotnet add package CsvHelper
    安装完成后,就可以在项目中引用CsvHelper并开始使用了。

读取CSV文件 

读取所有记录

假设我们有一个CSV文件,内容如下:

Id,Name
1,Tom
2,Jerry

以及一个对应的类定义:

public class Person
{
    public int Id { getset; }
    public string Name { getset; }
}

如果CSV文件的列名与类属性名称匹配,我们可以无需任何配置就可读取文件:

using (var reader = new StreamReader("path/to/file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var records = csv.GetRecords<Person>().ToList();
}

GetRecords方法将返回一个IEnumerable<Person>,它会按需yield记录。这意味着当你遍历记录时,每次只返回一条记录,只有文件的一小部分被读入内存。

逐条读取

如果需要逐条读取CSV文件中的记录,可以使用以下代码:

using (var reader = new StreamReader("path/to/file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    while (csv.Read())
    {
        var record = csv.GetRecord<Person>();
        // 处理每条记录
    }
}

这种方式在处理大型CSV文件时非常有用,因为它不会一次性将所有数据加载到内存中。

读取单个字段

有时我们只需要读取CSV文件中的某些字段,而不是整个记录。可以使用GetField方法来实现:

using (var reader = new StreamReader("path/to/file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    csv.Read();
    csv.ReadHeader();
    while (csv.Read())
    {
        var id = csv.GetField<int>(0);
        var name = csv.GetField<string>("Name");
        // 处理字段
    }
}

这里GetField<int>(0)表示获取第一列的整数值,GetField<string>("Name")表示获取名为"Name"的列的字符串值。

写入CSV文件 

写入所有记录

写入CSV文件时,可以一次性写入所有记录:

var records = new List<Person>
{
    new Person { Id = 1, Name = "Tom" },
    new Person { Id = 2, Name = "Jerry" },
};
using (var writer = new StreamWriter("path/to/file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(records);
}

这将根据Person类的属性顺序将记录写入CSV文件。

逐条写入

如果需要逐条写入记录,可以使用以下代码:

using (var writer = new StreamWriter("path/to/file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    foreach (var record in records)
    {
        csv.WriteRecord(record);
    }
}

这种方式在处理动态生成的数据时非常有用。

逐字段写入

还可以逐字段写入CSV文件:

using (var writer = new StreamWriter("path/to/file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteHeader<Person>();
    csv.NextRecord();
    foreach (var record in records)
    {
        csv.WriteField(record.Id);
        csv.WriteField(record.Name);
        csv.NextRecord();
    }
}

这种方式可以更灵活地控制字段的写入顺序。

高级特性 

特性

CsvHelper提供了多种特性,用于配置字段的映射和处理方式:

  • Index:标记字段顺序,适用于没有标题的CSV文件。
  • Name:指定字段名称,当字段名称与列名不一致时使用。
  • Ignore:忽略某个字段,不将其写入CSV文件。
  • Optional:标记字段为可选,当字段缺失时不会抛出异常。

配置

CsvHelper的配置非常灵活,可以通过CsvConfiguration类进行各种设置:

  • Delimiter:指定字段分隔符,默认为逗号。
  • HasHeaderRecord:指定CSV文件是否有标题记录。
  • IgnoreBlankLines:忽略空行。
  • AllowComments:允许注释行。
  • BadDataFound:处理包含不良数据的行。

自定义类型转换器

CsvHelper允许我们自定义类型转换器,以满足特定的数据转换需求。例如,可以创建一个自定义的日期转换器:

public class CustomDateConverter : DefaultTypeConverter
{
    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    {
        return DateTime.ParseExact(text, "yyyy-MM-dd", CultureInfo.InvariantCulture);
    }
}

然后在类属性上使用该转换器:

public class Person
{
    [TypeConverter(typeof(CustomDateConverter))]
    public DateTime BirthDate { getset; }
}

结论 

CsvHelper作为一个功能强大且易于使用的.NET库,极大地简化了CSV文件的读写操作。它不仅支持基本的读写功能,还提供了丰富的配置选项和高级特性,能够满足各种复杂的数据处理需求。无论是数据导入导出、数据交换还是其他需要处理CSV文件的场景,CsvHelper都是一个值得信赖的工具。希望本文能够帮助你在.NET项目中更高效地使用CsvHelper,提升开发效率和数据处理能力。


该文章在 2024/12/25 16:15:11 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved