C#使用csvhelper实现csv的操作

新建控制台项目

安装csvhelper 33.0.1
在这里插入图片描述

写入csv

新建Foo.cs

namespace CsvSut02;

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

批量写入

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        List<Foo> foos = new List<Foo>();
        for (int i = 0; i < 100; i++)
        {
            foos.Add(new Foo()
            {
                Id = i,
                Name = "我是" + i
            });
        }

        var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
        using (var writer = new StreamWriter(fileName))
        {
            var config = new CsvConfiguration(CultureInfo.InvariantCulture);
            using (var csv = new CsvWriter(writer, config))
            {
                csv.WriteRecords(foos);
            }
        }
    }
}

在这里插入图片描述

逐条写入

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        List<Foo> foos = new List<Foo>();
        for (int i = 0; i < 100; i++)
        {
            foos.Add(new Foo()
            {
                Id = i,
                Name = "我是" + i
            });
        }

        var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
        using (var writer = new StreamWriter(fileName))
        {
            var config = new CsvConfiguration(CultureInfo.InvariantCulture);
            using (var csv = new CsvWriter(writer, config))
            {
	            //这里看过来
                foreach (var foo in foos)
                {
                    csv.WriteRecord(foo);
                    csv.NextRecord();
                }
            }
        }
    }
}

在这里插入图片描述

增加标题

特性方式

using CsvHelper.Configuration.Attributes;

namespace CsvSut02;

public class Foo
{
    [Name("Id")]
    public int Id { get; set; }
    
    [Name("Name")]
    public string Name { get; set; }
}

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        List<Foo> foos = new List<Foo>();
        for (int i = 0; i < 100; i++)
        {
            foos.Add(new Foo()
            {
                Id = i,
                Name = "我是" + i
            });
        }

        var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
        using (var writer = new StreamWriter(fileName))
        {
            var config = new CsvConfiguration(CultureInfo.InvariantCulture);
            using (var csv = new CsvWriter(writer, config))
            {
                csv.WriteHeader<Foo>();
                csv.NextRecord(); 
                foreach (var foo in foos)
                {
                    csv.WriteRecord(foo);
                    csv.NextRecord();
                }
            }
        }
    }
}

在这里插入图片描述

配置类

新建FooClassMap.cs

using CsvHelper.Configuration;

namespace CsvSut02;

public class FooClassMap : ClassMap<Foo>
{
    public FooClassMap()
    {
        Map(m => m.Id)
            .Index(0)
            .Name("id");
        Map(m => m.Name)
            .Index(1)
            .Name("name");
    }
}

修改Program.cs

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        List<Foo> foos = new List<Foo>();
        for (int i = 0; i < 100; i++)
        {
            foos.Add(new Foo()
            {
                Id = i,
                Name = "我是" + i
            });
        }

        var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
        using (var writer = new StreamWriter(fileName))
        {
            var config = new CsvConfiguration(CultureInfo.InvariantCulture);
            using (var csv = new CsvWriter(writer, config))
            {
                csv.Context.RegisterClassMap<FooClassMap>();
                csv.WriteHeader<Foo>();
                csv.NextRecord();
                foreach (var foo in foos)
                {
                    csv.WriteRecord(foo);
                    csv.NextRecord();
                }
            }
        }
    }
}

在这里插入图片描述

可能有人觉得麻烦,使用配置类可以保证原始类的纯粹,保证poco

读取csv

读取和写入一样,可以两种方式实现一个是配置类一个是特性,下面都以特性演示

无标题csv

在这里插入图片描述

using CsvHelper.Configuration.Attributes;

namespace CsvSut02;

public class Foo
{
    [Index(0)]
    public int Id { get; set; }
    
    [Index(1)]
    public string Name { get; set; }
}

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        var file = "2024_07_24_18_24_00.csv";
        using (var reader = new StreamReader(file))
        {
            var config = new CsvConfiguration(CultureInfo.InvariantCulture);
            config.HasHeaderRecord = false;//没有头部
            using (var csv = new CsvReader(reader, config))
            {
                var records = csv.GetRecords<Foo>().ToList();
                foreach (var record in records)
                {
                    Console.WriteLine(record.Id);   
                }
            }
        }
    }
}

在这里插入图片描述

有标题csv

在这里插入图片描述

using CsvHelper.Configuration.Attributes;

namespace CsvSut02;

public class Foo
{
    [Name("id")]
    public int Id { get; set; }
    
    [Name("name")]
    public string Name { get; set; }
}

using CsvHelper.Configuration.Attributes;

namespace CsvSut02;

public class Foo
{
    [Name("id")]
    public int Id { get; set; }
    
    [Name("name")]
    public string Name { get; set; }
}

using System.Globalization;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        var file = "2024_07_24_18_30_49.csv";
        using (var reader = new StreamReader(file))
        {
            var config = new CsvConfiguration(CultureInfo.InvariantCulture);
            config.HasHeaderRecord = true;//有头部
            using (var csv = new CsvReader(reader, config))
            {
                var records = csv.GetRecords<Foo>().ToList();
                foreach (var record in records)
                {
                    Console.WriteLine(record.Id);   
                }
            }
        }
    }
}

在这里插入图片描述

增量写入

using System.Globalization;
using System.Text;
using CsvHelper;
using CsvHelper.Configuration;

namespace CsvSut02;

class Program
{
    static void Main(string[] args)
    {
        var fileName = $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.csv";
        WriteModelWithAppend(fileName);
        WriteModelWithAppend(fileName);
    }
    
    /// <summary>
    /// 追加方式写入
    /// </summary>
    /// <param name="fileName"></param>
    static void WriteModelWithAppend(string fileName)
    {
        var model = new Foo();
        model.Id = 1;
        model.Name = "测试";
        // 检查文件是否存在,以确定是否应该以追加模式打开  
        var mode = File.Exists(fileName) ? FileMode.Append : FileMode.Create;
        var config = new CsvConfiguration(CultureInfo.InvariantCulture);
        using var writer = new StreamWriter(new FileStream(fileName, mode, FileAccess.Write, FileShare.Read),
            Encoding.UTF8);
        using var csv = new CsvWriter(writer, config);
        
        if (mode == FileMode.Create)
        {
            csv.WriteHeader<Foo>();
            csv.NextRecord(); 
        }
        csv.WriteRecord(model);
        csv.NextRecord(); 
    }
}

在这里插入图片描述

注意多线程有问题需要加锁

参考

https://blog.csdn.net/guliang21/article/details/106233049
https://joshclose.github.io/CsvHelper/getting-started

C# WinForms是一种用于创建Windows桌面应用程序的开发框架,而CSV(逗号分隔值)是一种常见的文件格式,用于存储表格数据。在C# WinForms中进行CSV导出可以通过以下步骤实现: 1. 首先,你需要创建一个WinForms应用程序,并添加一个按钮或其他触发导出操作的控件。 2. 在按钮的点击事件处理程序中,你可以使用C#的文件操作类(如StreamWriter)来创建一个CSV文件,并将数据写入其中。你可以使用适当的分隔符(如逗号)将每个字段分隔开。 3. 在写入CSV文件之前,你需要准备好要导出的数据。这可以是来自数据库、集合或其他数据源的数据。你可以使用C#的数据访问技术(如ADO.NET)来检索和处理数据。 4. 将数据写入CSV文件时,你可以使用循环遍历数据集合,并将每个字段的值写入文件中。确保在每行结束时添加换行符。 5. 最后,保存并关闭CSV文件。 下面是一个简单的示例代码,演示了如何在C# WinForms中进行CSV导出: ```csharp private void btnExport_Click(object sender, EventArgs e) { // 准备要导出的数据(示例数据) List<string[]> data = new List<string[]> { new string[] { "Name", "Age", "Email" }, new string[] { "John Doe", "30", "john@example.com" }, new string[] { "Jane Smith", "25", "jane@example.com" }, new string[] { "Bob Johnson", "35", "bob@example.com" } }; // 创建并打开CSV文件 using (StreamWriter sw = new StreamWriter("export.csv")) { // 写入数据到CSV文件 foreach (string[] row in data) { sw.WriteLine(string.Join(",", row)); } } MessageBox.Show("CSV导出成功!"); } ``` 请注意,上述示例仅演示了基本的CSV导出过程。在实际应用中,你可能需要根据具体需求进行更复杂的数据处理和格式化操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值