MailKit: 在 .NET 中实现高效电子邮件发送与接收

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. 资源链接

相关推荐
逛逛GitHub2 小时前
一个饺子馆在 GitHub 上开源了自己的 Skill。 北京海淀,杏坛路,北京邮电大学旁边,有一家快 20 年的饺子馆——金谷园。 好像几乎所有的北邮小伙
github
light blue bird2 小时前
主从执行端动机模块工序协同组件
jvm·数据库·.net·桌面端
CoderJia程序员甲3 小时前
GitHub 热榜项目 - 日榜(2026-04-13)
ai·大模型·github·ai教程
BothSavage4 小时前
OpenHarness源码研究-1-配置打包管理
github
FreeBuf_4 小时前
黑客滥用 GitHub 和 GitLab 托管恶意软件并实施凭证钓鱼攻击
gitlab·github
周杰伦fans4 小时前
如何将 Feature 分支同步到 Master 主分支:一次完整的 Git 合并实战
git
jiayi_19994 小时前
git创建new branch
git
__Witheart__5 小时前
通过交互式 Rebase 合并部分提交到远程分支的操作步骤
git
三无推导5 小时前
GitHub爆火项目ChinaTextbook——开源如何重新定义教育普惠的边界
学习·开源·github