.net解析csv(C#导表工具)

本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhaoqingqing/p/10150083.html



前言#

解析Excel有知名的NPOI库,(Java语言是POI),但是NPOI是不支持解析csv的。

csv本质上也是文本文件,可以进行差异对比,更利于解决冲突。

本文对解析csv的几个.net的开源库进行调研

性能测试#

本次性能测试结果来自:.NET Core中的CSV解析库

当测试100000行数据的时候

当测试1000000行数据的时候

从测试结果上看
Tiny Csv Parser的效率比CSVHelper高很多,内存占用也少很多。

最终结论
当不需要支持字符串换行的时候,请使用Tiny Csv Parser
当需要支持字符串换行的时候,请使用CSVHelper

测试csv#

第二行中有人为换行符,在Tiny Csv 和 csv中会解析不出来,而CSVHelper则可以

Make Model Comment
内容1 内容2 这是一个换行,
的内容
内容2-1 内容2-1 单行注释

CSVHelper示例#

如果要读取某行的原始数据,基本内容是在 csvReader.Context 字段

Copy
public static void ParseCsvDemo(string filePath) { CsvReader csvReader = null; using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (StreamReader reader = new StreamReader(fileStream, Encoding.GetEncoding("GB2312"))) { csvReader = new CsvReader(reader); //设置之后,不读取第一列,且列数也会减少 // csvReader.Configuration.HasHeaderRecord = false; int rowCount = 0; while (csvReader.Read()) { //列数 var columnCount = csvReader.Context.Record.Length; //每行的原始数据 var raw = csvReader.Context.RawRecord; rowCount = rowCount + 1; if (rowCount == 2) { var fileName = csvReader.GetField<string>(2); Console.WriteLine("输出名:{0}", fileName); } Console.WriteLine("行:{0} ,列:{1},内容:{2}", rowCount, columnCount, raw); } } } }

注:对于csvhelper提供的映射关系(把表的一行数据结构转成 class类型),我未使用到,因为我们主要是提取表的数据。

使用情景#

使用C#开发的导表工具,可以导出excel和csv,支持把excel数据插入到SQL数据库,且Excel的格式可以自定义。

这个项目已开源,可参考我之前的文章:

TableML Excel编译/解析工具

TableML-GUI篇(C# 编译/解析 Excel/CSV工具)

遇到问题#

问题:未能加载文件或程序集,或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配

解决方案: 使用nuget更新使用到的库或者检查库所依赖的.net framework版本和项目的基于的.net framework版本是否一致。

作者:赵青青   一名在【网易游戏】做游戏开发的程序员,擅长Unity3D,游戏开发,.NET等领域。
本文版权归作者和博客园共有,欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
posted @   赵青青  阅读(4729)  评论(2编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
历史上的今天:
2015-12-20 Unity 5 WebGL vs Web Player
2015-12-20 Unity 5.3 安装完没有Android(安卓)或IOS Module(模块)?
点击右上角即可分享
微信分享提示
CONTENTS