当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【数据采集与可视化案例】基于python的国家级非物质文化遗产数据采集与可视化分析
  • 【漏洞扫描器】使用nessus扫描工具扫描服务器,并生成漏扫报告
  • SpringBoot Vue用自签名证书SSL配置https,http转发到https(整理文章)
  • test1111
  • 【前端】fis框架学习
  • 大模型是如何“炼”成的?揭秘AI背后的训练秘籍!
  • 消息推送只会用websocket、轮询?试试SSE,轻松高效。
  • Linux云计算 |【第二阶段】AUTOMATION-DAY5
  • moment.js的使用方法
  • mysql数据库知识总结
  • 10个append()函数在Python程序开发中的创新应用
  • 如何搭建数字人直播系统?快速上手方法来了!
  • docker安装phpMyAdmin
  • MySQL频繁超时原因调查
  • 达梦数据库归档介绍
  • Debian下无root权限使用Python访问Oracle
  • docker python 配置
  • HTTP 简介
  • input的行数自动增减
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Promise面试题,控制异步流程
  • python 装饰器(一)
  • 创建一种深思熟虑的文化
  • 从零开始学习部署
  • 力扣(LeetCode)56
  • 容器服务kubernetes弹性伸缩高级用法
  • 数据结构java版之冒泡排序及优化
  • 微服务框架lagom
  • 在Mac OS X上安装 Ruby运行环境
  • 找一份好的前端工作,起点很重要
  • Java性能优化之JVM GC(垃圾回收机制)
  • # C++之functional库用法整理
  • ## 1.3.Git命令
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (23)Linux的软硬连接
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (void) (_x == _y)的作用
  • (八)Spring源码解析:Spring MVC
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转) Face-Resources
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .Net Remoting常用部署结构
  • .Net 代码性能 - (1)
  • .NET导入Excel数据
  • .Net的C#语言取月份数值对应的MonthName值
  • .net反编译的九款神器
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .Net语言中的StringBuilder:入门到精通
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .sh 的运行
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • ;号自动换行
  • @requestBody写与不写的情况
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)