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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487722.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Meta发布Llama 3.1模型

Llama 3.1模型 Meta&#xff08;原Facebook&#xff09;开发的一款大型语言模型&#xff08;LLM&#xff09;&#xff0c;该模型在多个方面展现出了强大的性能和广泛的应用潜力。关于Llama 3.1模型的规模与参数&#xff0c;具体概述如下&#xff1a; 一、模型规模 Llama 3.1…

VBA实例-从Excel整理数据到Word

实现目录 功能需求数据结构复制数据到新sheet并分类数据添加序号、日期、时间三列数据添加序号列添加时间列 将名称和类别复制到word文件中将参数5和参数9中的一个复制到word文件中 实例 功能需求 1、将原始数据中不要的数据剔除 2、原始数据中增加序号、日期和时间三列数据&a…

opengl 写一个3D立方体——计算机图形学编程 第4章 管理3D图形数据 笔记

计算机图形学编程&#xff08;使用OpenGL和C&#xff09; 第4章 管理3D图形数据 笔记 数据处理 想要绘制一个对象&#xff0c;它的顶点数据需要发送给顶点着色器。通常会把顶点数据在C端放入 一个缓冲区&#xff0c;并把这个缓冲区和着色器中声明的顶点属性相关联。 初始化立…

【Unity2D 2022:UI】无法拖拽TextMeshPro组件

在预制体Card上挂载了四个Text Mesh Pro组件&#xff0c;分别命名为Name、HP、ATK、Description。 将预制体Card挂载脚本CardDisplay用来在预制体上显示属性&#xff0c;并创建TextMeshPro对象来接收TextMeshPro组件。 using TMPro; using UnityEngine; using UnityEngine.UI;…

leetcode日记(49)旋转链表

其实不难&#xff0c;就是根据kk%len判断需要旋转的位置&#xff0c;再将后半段接在前半段前面就行。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : …

2、springboot3 vue3开发平台-后端-基础数据准备,MybatisPlus整合

文章目录 1. 基础数据准备2. 整合MybatisPlus3. MybatisPlus 配置3.1 数据源配置3.2 mybatis-plus 分页插件配置3.3 mybatis-plus 自动填充3.4 代码生成器 1. 基础数据准备 直接拿前辈做的表结构使用。 /*Navicat Premium Data TransferSource Server : localhost_my…

sql server 连接报错error 40

做个简单的记录,造成40 的原因有很多,你的错误并不一定就是我遇到的这种情况. 错误描述: 首先我在使用ssms 工具连接的时候是可以正常连接的,也能对数据库进行操作. 在使用 ef core 连接 Sql Server 时报错: Microsoft.Data.SqlClient.SqlException (0x80131904): A network-r…

【Linux】从零开始认识多线程 --- 线程互斥

人生有许多事情 正如船后的波纹 总要过后才觉得美的 -- 余光中 线程互斥 1 线程类的封装1.1 框架搭建1.2 线程启动1.3 线程终止1.4 线程等待1.5 运行测试 2 线程互斥2.1 多线程访问的问题2.2 解决办法 --- 锁2.3 从原理角度理解锁 Thanks♪(&#xff65;ω&#xff65;)&am…

后端返回一个图片链接,前端如何实现下载功能?

纯原创文章&#xff0c;转载请说明来源。 一、背景 要实现一个下载功能&#xff0c;后端直接返回了一个图片的地址https://xxxxx/pic.jpg。如果我们直接通过window.open(url, _blank) 的方式去下载这个图片&#xff0c;会发现 Chrome 浏览器会对这个图片进行预览&#xff0c;…

氧气传感器在汽车制氧检测中的应用

在当今汽车工业中&#xff0c;技术的快速发展不仅带来了驾驶安全性和舒适性的显著提升&#xff0c;还为车辆增加了各种智能功能&#xff0c;以应对不同的驾驶环境和需求。氧气传感器作为一种关键的技术装置&#xff0c;在汽车制氧检测系统中的应用&#xff0c;尤其是针对疲劳驾…

DDoS 究竟在攻击什么?

分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常见的网络攻击形式&#xff0c;攻击者通过向目标服务端发送大量的请求&#xff0c;使目标服务端无法进行网络连接&#xff0c;无法正常提供服务。 DDoS 攻击通常是由大量的分布在全球各地的 “僵尸” 计算机&#xff08…

npm下载pnpm

一、提供node_global和node_cache的文件夹 若不存在&#xff0c;可自行新建文件夹 二、配置环境变量 配置NODE_PATH变量&#xff1a; 配置Path变量&#xff1a; 三、执行cmd指令 npm config set prefix "D:\Configure\nodejs\node_global" npm config set cache &…

【Python】Facebook开源时间序列数据预测模型Prophet

文章目录 一、简介二、项目的文件解读三、Prophet类主要方法和参数3.1 主要参数3.2 主要方法 四、用法示例 一、简介 Prophet 是由 Facebook 开发的一个开源工具&#xff0c;用于时间序列数据的预测。它特别适用于处理具有强季节性和趋势的时间序列数据&#xff0c;并且对节假…

【数学建模】——【python】实现【最短路径】【最小生成树】【复杂网络分析】

目录 1. 最短路径问题 - 绘制城市间旅行最短路径图 题目描述&#xff1a; 要求&#xff1a; 示例数据&#xff1a; python 代码实现 实现思想&#xff1a; 要点&#xff1a; 2. 最小生成树问题 - Kruskal算法绘制MST 题目描述&#xff1a; 要求&#xff1a; 示例数据…

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…

c生万物系列(封装)

为了对c语言进行封装&#xff0c;笔者参考了lw_oopc等开源库&#xff0c;决定使用宏对结构体进行封装。 先说一下大致思想&#xff1a;通过宏&#xff0c;结构体和文件来实现封装。 大概步骤&#xff1a;抽象出类-> 使用lw_oopc库进行封装->定义接口封装底层实现 ->…

GAMES104:05游戏引擎中的渲染系统2:渲染中的光照、材质和shader-学习笔记

文章目录 一、渲染方程及其挑战二、基础光照解决方案-简化版简化光源简化材质简化阴影 三、基于预计算的全局光照3.1挑战和计算思路傅里叶变换球谐函数&#xff08;Spherical Harmonics&#xff09; 3.2 SH Lightmap&#xff1a;预计算 GI3.3 探针 Probe&#xff1a;Light Prob…

【React 】开发环境搭建详细指南

文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中&#xff0c;React 是一个非常流行的框架&#xff0c;用…

sed利用脚本处理文件

一、sed是什么 sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编 辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 二、sed的原理 读入新的一行内容到缓存空间&#xff1b; 从指定的操作指令中取出第一条指令&…