目录
- 新建控制台项目
 - 写入csv
 - 批量写入
 - 逐条写入
 - 增加标题
 - 特性方式
 - 配置类
 - 读取csv
 - 有标题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(); 
    }
}

注意多线程有问题需要加锁
以上就是C#使用csvhelper实现csv的基本操作的详细内容,更多关于C# csvhelper实现csv操作的资料请关注其它相关文章!
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
		
评论(0)