感谢

本篇首先特别感谢从此启程兄的《.NetCore外国一些高质量博客分享》, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下。

.NET Core中的CSV解析库

本篇博客来源于.NET Core Totorials的《CSV Parsing In .NET Core》。

背景介绍

对于初级程序员来说, 使用string.Split(',')来解析CSV文件基本就是唯一可行的方法, 但是之后他们会发现除了使用逗号分隔值之外,CSV中还有其他需要处理的东西,所以作者就介绍了CSV解析的一些痛点并推荐了2个比较好用CSV解析库。

CSV解析一些痛点

  • 一个CSV文件有可能有表头,也可能没有表头。如果表头存在的话,解析CSV时,列的顺序就不太重要了,因为你可以根据表头知道所需的数据在第几列。如果表头不存在的话,解析CSV时,就需要依赖列的顺序。所以CSV的解析,应该即支持表头,也支持按列的顺序。

  • CSV文件中某一列的值可能是带双引号的字符串,字符串中可能包含换行符、逗号,双引号。

    • 例1:1,2,"a,b"

    • 例2: 1,2,"a[换行符]b"

    • 例3: 1,2,"this is ""Good""." (注:双引号字符串中的出现的连续双引号表示转义,这里真正的文本是this is "Good".)

  • CSV文件中每一行的数据的数据列数量“应该”一样,但不是必须一样,所以解析CSV需要处理这些不一致的情况

  • 在.NET中,当反序列化一个CSV文件的时候,还需要

    • 支持反序列化成集合

    • 支持枚举

    • 支持自定义映射

    • 支持映射嵌套对象

.NET Core中的一些优秀CSV解析库

这里作者推荐了2个CSV解析库,一个是CSVHelper, 一个是Tiny CSV Parser。

测试例子

为了测试这些CSV解析库,我们首先创建一个.NET Core的控制台程序

然后我们添加一个Automobile类,其代码如下

最后我们创建一个csv文件sample.txt作为测试文件,我们希望将当前csv文件中的数据,反序列化到一个Automobile类的对象实例中。

其内容如下

Make,Model,Type,Year,Price,Comment"Toyota",Corolla,Car,1990,2000.99,"Comment with a,
line break and "" quotes"

这个文件中第一行是一个表头,第二行是一个数据行,数据行中包含了

  • 字符串内容换行

  • 字符串中有逗号

  • 字符串中有双引号

CSVHelper

CSVHelper是一个CSV文件的读写库。它支持读写自定义类对象。官网地址https://joshclose.github.io/CsvHelper/

安装

我们可以使用Package Manager Console来安装CSVHelper。

命令如下:

PM> Install-Package CsvHelper

解析CSV

使用CSVHelper解析CSV文件代码很简单, 还需要2步

  • 使用CsvReader类的对象实例读取CSV文件

  • 使用GetRecords方法来反序列化

最终结果

从结果上看,上面提到的CSV解析痛点,CSVHelper都实现了,特别是针对Comment字段中的逗号、换行、双引号,CSVHelper都处理的很成功。

Tiny CSV Parser

下一个介绍的CSV解析器是Ting CSV Parser, 官网http://bytefish.github.io/TinyCsvParser/index.html, 它是使用配置的方式映射CSV字段, 使用方式上有点类似于AutoMapper

安装

我们可以使用Package Manager Console来安装Tiny CSV Parser。

命令如下:

PM> Install-Package TinyCsvParser

解析CSV

使用Tiny CSV Parser解析CSV文件,首先我们需要创建一个映射类。映射类需要继承自CsvMapping

映射类代码

其中有几个要点,

  • MapProperty是根据列的索引来映射属性的。

  • 当映射枚举时,需要使用EnumConverter来映射。

  • 当映射子对象的时候,需要创建子对象对应的Converter, 例如AutomobileCommentTypeConverter

然后我们修改Program.cs, 使用CsvParser来解析sample.txt

最终结果

从结果上看,Tiny CSV Parser实现了大部分CSV解析的痛点,唯一不支持的是字符串换行,这一点需要注意。

效率比较

文章的最后,作者使用Benchmark对CSVHelper和Tiny CSV Parser进行了效率比较。

测试代码如下:

当测试100000行数据的时候

当测试1000000行数据的时候

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

最终结论

  • 当不需要支持字符串换行的时候,请使用Tiny Csv Parser

  • 当需要支持字符串换行的时候,请使用CSVHelper

原文地址: https://www.cnblogs.com/lwqlun/p/9639456.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.NET Core中的CSV解析库相关推荐

  1. Andorid中使用Jsoup解析库解析XML、HTML、Dom节点---第三方库学习笔记(三)

    XML介绍: XML简介: XML,可扩展标记语言,标准通用标记语言的子集. 一种用于标记电子文件使其具有结构性的标记语言. 它可以用来标记数据.定义数据类型 是一种允许用户对自己的标记语言进行定义的 ...

  2. 爬虫的步骤解析内容xpath介绍_Xpath的基本方法和使用详解 Python爬虫中最好用解析库...

    在爬虫开发的过程中还有一种解析html的方法,就是xpath,今天这篇文章就来详细介绍一下,至于你以后使用不使用呢就看你自己的个人爱好了.XPath 是一门在 XML 文档中查找信息的语言.XPath ...

  3. 六、爬虫中重要的解析库xpath和BeautifulSoup

    @Author:Runsen BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便,常常能够节省我们大量的时间. 文章目录 ...

  4. python中常用js解析库比对分析

    1.PyV8  Google开源的javascript的引擎,被使用在Chrome中(年久失修,内存泄漏) 2.Js2Py  纯Python实现解释器和翻译器(性能不高,有BUG) 3.PyminiR ...

  5. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  6. csv文件示例_自己动手? -一个简单的CSV解析器示例

    csv文件示例 Download source code - 2.7 MB 下载源代码2.7 MB 目录 (Table of Contents) Introduction 介绍 The Dataset ...

  7. java 读取tsv_uniVocity-parsers:一款强大的CSV/TSV/定宽文本文件解析库(Java)

    uniVocity-parsers 是一个开源的Java项目. 针对CSV/TSV/定宽文本文件的解析,它以简洁的API开发接口提供了丰富而强大的功能.后面会做进一步介绍. 和其他解析库有所不同,un ...

  8. 爬虫-解析库的使用-Xpath

    4. 解析库的使用 对于网页节点,可以定义id.class或其他属性,且节点之间有曾是关系,可以通过Xpath 或者CSS选择器来定位一个或者多个节点,再调用相应的方法获取它的正文内容或者属性. py ...

  9. .NET Core中使用编码GB2312报错:‘GB2312‘ is not a supported encoding name 的解决方案

    #事故现场 在.Net Core中使用XElement解析GB2312编码的xml文件, 代码如下: string xmlp = "G:\\test\\content.xml"; ...

最新文章

  1. 【个人随笔】准备整理整理以往的资料
  2. bootstrape实战案例_第二百五十二节,Bootstrap项目实战-首页
  3. .NET | 多线程下的调用上下文 : CallContext
  4. 墙面有几种装修方法_新房装修除甲醛 用这几种方法就足够
  5. 【WiFi密码破解详细图文教程】ZOL仅此一份 详细介绍从CDlinux U盘启动到设置扫描破解
  6. 需求分析阶段各种图的功能
  7. Python判断不可变对象(字符串,整数,浮点数,数组)相等的办法以及其底层实现原理
  8. 【实践驱动开发2-001】wifi 在android 下的实现 - AR6000 系列移植详细步骤
  9. JS-复习回调构造函数对象
  10. 324. Wiggle Sort II
  11. linux和Windows之间互传文件
  12. Selenium 显示等待和隐式等待
  13. 函数内联inline
  14. 【整理分享1】PHP中exit()与die()的区别
  15. javaScript中的垃圾回收机制
  16. 计算机启动灯光提示,为什么我的电脑开机时指示灯为黄色并不断闪烁,且开不开机?...
  17. 谷歌浏览器任务栏图标变白色解决方法
  18. HTML标签关系——双标签和单标签,标签的嵌套与并列
  19. 你还在为不知道怎么给家人庆祝生日而发愁吗?
  20. 苹果app-H5封装源码-一键封装app搭建

热门文章

  1. 找回创新能力 才是苹果的救命稻草
  2. SQL Server日期函数集合
  3. SignalR的使用
  4. 宇宙最強的IDE - Visual Studio 25岁生日快乐
  5. C#获2021年度编程语言奖,开发者们最该关注这些亮点!
  6. C# 企业微信消息推送对接,实现天气预报推送
  7. 《Redis核心技术与实战》学习总结(1)
  8. Binding(三):资源和ValueConverter
  9. using IDisposable
  10. ML.NET Cookbook:(5)如何查看中间过程数据?