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

相关推荐
MUTA️6 小时前
Git的使用(程序猿必会)
github
时光追逐者11 小时前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio
MUTA️11 小时前
git传输超过100MB的文件
git
ALex_zry11 小时前
Git大型仓库推送失败问题完整解决方案
大数据·git·elasticsearch
二进制coder13 小时前
Git Fork 开发全流程教程
大数据·git·elasticsearch
程序员馨馨13 小时前
不扰远程仓库,本地双版本:master 留 A 稿,分支藏 B 稿
git
算家云13 小时前
基于GitHub Actions与算力平台API:构建端到端的模型自动训练与部署流水线
github·模型部署·算家云·租算力,到算家云·算力平台
无限进步_13 小时前
C语言动态内存的二维抽象:用malloc实现灵活的多维数组
c语言·开发语言·数据结构·git·算法·github·visual studio
用户478612972069213 小时前
Git:如何排查非线性历史中被隐秘覆盖的修改(完整实战笔记)
git
NocoBase15 小时前
8 个最佳 Google Sheets 替代方案(附成本与能力分析)
低代码·开源·github