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

相关推荐
江边垂钓者7 小时前
Git简介和发展
git
Kookoos9 小时前
ABP vNext + Dapr 实现云原生微服务治理
微服务·云原生·架构·c#·.net
老马啸西风9 小时前
sensitive-word-admin v2.0.0 全新 ui 版本发布!vue+前后端分离
vue.js·ui·ai·nlp·github·word
bicijinlian10 小时前
.Net HttpClient 处理响应数据
c#·.net·httpclient·.net httpclient
是代码侠呀10 小时前
飞蛾扑火算法matlab实现
开发语言·算法·matlab·github·github star·github 加星
编程乐趣10 小时前
一个.Net开源的关系管理系统
开源·c#·.net
大卫小东(Sheldon)12 小时前
GIM: 调用AI自动生成git提交消息的工具
git·rust
大龄牛码12 小时前
GitHub打开缓慢甚至失败的解决办法
github
喵叔哟13 小时前
17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--微服务基础工具与技术--loki
微服务·架构·.net
E-iceblue13 小时前
C# 从PDF文档中提取图片
c#·.net·提取图片·pdf提取