.NET Core中的CSV解析库

感谢

本篇首先特别感谢从此启程兄的《.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的控制台程序

640?wx_fmt=png

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

640?wx_fmt=png

最后我们创建一个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方法来反序列化

640?wx_fmt=png

最终结果
640?wx_fmt=png

从结果上看,上面提到的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

映射类代码

640?wx_fmt=png

其中有几个要点,

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

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

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

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

640?wx_fmt=png

最终结果

640?wx_fmt=png

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

效率比较

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

测试代码如下:

640?wx_fmt=png

当测试100000行数据的时候
640?wx_fmt=png

当测试1000000行数据的时候
640?wx_fmt=png

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

最终结论

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

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

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


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

640?wx_fmt=jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么要使用Entity Framework

本文介绍从DDD(Domain-Driven Design[领域驱动设计])的角度来说说为什么要使用Entity Framework(以下都会简称为EF),同时也看出类似Drapper之类的简陋ORM不足的地方。设想业务都是大家知晓的权限管理,实体类如下。读到这里,请先思考一下&…

Tarjan算法

Tarjan算法可以应用在求解 强连通分量,缩点,桥,割点,双连通分量,LCA等 关于文章目录强连通分量代码题目tarjan求割点割点概念流程代码:求无向图的割边/桥理解:代码:强连通…

Ocelot简易教程(一)之Ocelot是什么

简单的说Ocelot是一个用.NET Core实现并且开源的API网关技术。可能你又要问了,什么是API网关技术呢?Ocelot又有什么特别呢?我们又该如何集成到我们的asp.net core程序中呢?下面我会通过一些列通俗易懂的教程来为大家讲解。今天的这…

如何在你的项目中集成 CAP【手把手视频教程】

前言之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差。这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新录…

【Splay】文艺平衡树(金牌导航 Splay-2)

#文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列,然后对序列的区间做若干次翻转,问你最后的序列 输入样例 5 3 1 3 1 3 1 4输出样例 4 3 2 1 5数据范围 1⩽n,m⩽105,1⩽l⩽r⩽n1\leqslant n,m\leqslant 10^5,1\leqslant l\leqslant r \l…

.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

前言本篇会继续讲解Sikiro.SMS.Job服务的实现,在我写第一篇的时候,我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要,而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。源码地址&a…

Drainage Ditches POJ1273

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 93263 Accepted: 36174试题链接 文章目录Description题意:题解:代码:Dinic做法EK做法Description Every time it rains on Farmer John’s fields, a pond forms over Bessie’…

P2756 飞行员配对方案问题【网络流24题】

P2756 飞行员配对方案问题 文章目录题目背景题解:代码:题目背景 第二次世界大战期间,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的两名飞行员,其中一名是英国…

大数据分析中使用关系型数据库的关键点

相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中。原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手。在我们正式的大数据团队,数仓(数据仓库H…

图论复习——最小生成树MST

知识点 MST的构造 Boruvka算法常用于解决这类问题:给你n个点,每个点有点权,任意两个点之间有边权,边权为两个点权用过某种计算方式得出,求最小生成树。动图 MST上的确定性和存在性问题 最小生成树的两个性质&#xf…

Ocelot简易教程(二)之快速开始1

Ocelot是为.net core量身定做的,目前是基于 netstandard2.0进行构建的。.NET Core 2.1中如何使用呢?安装NuGet package使用nuget安装Ocelot及其依赖项。您需要创建一个netstandard2.0项目并将其Package安装到项目中。然后按照下面的“启动”和“ 配置”节…

P2761 软件补丁问题

文章目录题目描述题解:代码:添加链接描述题目描述 T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m 个补丁程序。每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些…

Xamarin中国技术社区及BXUG官网上线啦

Xamarin中国技术社区及BXUG官网为.NET开发者提供移动跨平台技术学习的园地,为Xamarin及.NET技术达人提供展示分享的舞台, 为企业CTO等技术负责人提供跨平台移动应用解决方案的交流平台!网址链接:http://bxug.bopoda.cn/Xamarin中国…

用python将图片转换成二值图像

大创项目是图像识别,第一个任务是将一个图片转换成二值图像 之前用过python的numpy和turtle,这次要用到图像库PIL的类Image,也算是刚刚从零开始学起 整体效果(用01串表示图像) 原理很简单:将图片中黑色…

.Net Core SignalR 初体验

前言Asp.Net SignalR已经出来很久了,但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档,如何搭建一个SignalR的Demo。参考文章:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?viewaspnet…

CF1251F-Red-White Fence【NTT】

前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 nnn个白色木板,kkk个红色木板,给出这些木板的高度,木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升&…

图论复习——dfs树,点双,边双,强连通分量

知识点 dfs树 对一个图运行 dfs 算法,每个点uuu的父亲定义为第一次遍历uuu时的前驱结点,若无则为根。 无向图的 dfs树 没有横叉边。 有向图的 dfs树 横叉边方向唯一,总是从后访问的点指向先访问的点。 dfs树详解 tarjan 点双 定义&#…

【点分治】Tree(luogu 4178/金牌导航 点分治-1)

Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树,问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4输出样例 8数据范围 1⩽N⩽41041\leqslant N \leqslant 4\times 10^41⩽N⩽4104 解题思路 对于该树&#xff0…

均分纸牌问题

均分纸牌有三种情况:线性,环形,二维 文章目录线性题目描述思路:代码:环形题目描述思路代码线性 题目描述 P1031 均分纸牌 有N堆纸牌,编号分别为1,2,…,N。每堆上有若干张,但纸牌总数必为N的倍…

.net core实践系列之短信服务-Api的SDK的实现与测试

前言上一篇《.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现》讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试。或许有些人会认为,SDK的编写可以不需要,既然已经用了RESTful web服务与Swagger提供的接口描述&…