.NET Core中的CSV解析库
感謝
本篇首先特別感謝從此啟程兄的《.NetCore外國一些高質(zhì)量博客分享》, 發(fā)現(xiàn)很多國外的.NET Core技術(shù)博客資源, 我會不定期從中選擇一些有意思的文章翻譯總結(jié)一下。
.NET Core中的CSV解析庫
本篇博客來源于.NET Core Totorials的《CSV Parsing In .NET Core》。
背景介紹
對于初級程序員來說, 使用string.Split(',')來解析CSV文件基本就是唯一可行的方法, 但是之后他們會發(fā)現(xiàn)除了使用逗號分隔值之外,CSV中還有其他需要處理的東西,所以作者就介紹了CSV解析的一些痛點(diǎn)并推薦了2個比較好用CSV解析庫。
CSV解析一些痛點(diǎn)
一個CSV文件有可能有表頭,也可能沒有表頭。如果表頭存在的話,解析CSV時,列的順序就不太重要了,因為你可以根據(jù)表頭知道所需的數(shù)據(jù)在第幾列。如果表頭不存在的話,解析CSV時,就需要依賴列的順序。所以CSV的解析,應(yīng)該即支持表頭,也支持按列的順序。
CSV文件中某一列的值可能是帶雙引號的字符串,字符串中可能包含換行符、逗號,雙引號。
例1:1,2,"a,b"
例2: 1,2,"a[換行符]b"
例3: 1,2,"this is ""Good""." (注:雙引號字符串中的出現(xiàn)的連續(xù)雙引號表示轉(zhuǎn)義,這里真正的文本是this is "Good".)
CSV文件中每一行的數(shù)據(jù)的數(shù)據(jù)列數(shù)量“應(yīng)該”一樣,但不是必須一樣,所以解析CSV需要處理這些不一致的情況
在.NET中,當(dāng)反序列化一個CSV文件的時候,還需要
支持反序列化成集合
支持枚舉
支持自定義映射
支持映射嵌套對象
.NET Core中的一些優(yōu)秀CSV解析庫
這里作者推薦了2個CSV解析庫,一個是CSVHelper, 一個是Tiny CSV Parser。
測試?yán)?/h3>
為了測試這些CSV解析庫,我們首先創(chuàng)建一個.NET Core的控制臺程序
然后我們添加一個Automobile類,其代碼如下
最后我們創(chuàng)建一個csv文件sample.txt作為測試文件,我們希望將當(dāng)前csv文件中的數(shù)據(jù),反序列化到一個Automobile類的對象實(shí)例中。
其內(nèi)容如下
Make,Model,Type,Year,Price,Comment"Toyota",Corolla,Car,1990,2000.99,"Comment with a, line break and "" quotes"這個文件中第一行是一個表頭,第二行是一個數(shù)據(jù)行,數(shù)據(jù)行中包含了
字符串內(nèi)容換行
字符串中有逗號
字符串中有雙引號
CSVHelper
CSVHelper是一個CSV文件的讀寫庫。它支持讀寫自定義類對象。官網(wǎng)地址https://joshclose.github.io/CsvHelper/
安裝
我們可以使用Package Manager Console來安裝CSVHelper。
命令如下:
PM> Install-Package CsvHelper解析CSV
使用CSVHelper解析CSV文件代碼很簡單, 還需要2步
使用CsvReader類的對象實(shí)例讀取CSV文件
使用GetRecords方法來反序列化
最終結(jié)果
從結(jié)果上看,上面提到的CSV解析痛點(diǎn),CSVHelper都實(shí)現(xiàn)了,特別是針對Comment字段中的逗號、換行、雙引號,CSVHelper都處理的很成功。
Tiny CSV Parser
下一個介紹的CSV解析器是Ting CSV Parser, 官網(wǎng)http://bytefish.github.io/TinyCsvParser/index.html, 它是使用配置的方式映射CSV字段, 使用方式上有點(diǎn)類似于AutoMapper
安裝
我們可以使用Package Manager Console來安裝Tiny CSV Parser。
命令如下:
PM> Install-Package TinyCsvParser解析CSV
使用Tiny CSV Parser解析CSV文件,首先我們需要創(chuàng)建一個映射類。映射類需要繼承自CsvMapping
映射類代碼
其中有幾個要點(diǎn),
MapProperty是根據(jù)列的索引來映射屬性的。
當(dāng)映射枚舉時,需要使用EnumConverter來映射。
當(dāng)映射子對象的時候,需要創(chuàng)建子對象對應(yīng)的Converter, 例如AutomobileCommentTypeConverter。
然后我們修改Program.cs, 使用CsvParser來解析sample.txt
最終結(jié)果
從結(jié)果上看,Tiny CSV Parser實(shí)現(xiàn)了大部分CSV解析的痛點(diǎn),唯一不支持的是字符串換行,這一點(diǎn)需要注意。
效率比較
文章的最后,作者使用Benchmark對CSVHelper和Tiny CSV Parser進(jìn)行了效率比較。
測試代碼如下:
當(dāng)測試100000行數(shù)據(jù)的時候
當(dāng)測試1000000行數(shù)據(jù)的時候
從測試結(jié)果上看
Tiny Csv Parser的效率比CSVHelper高很多,內(nèi)存占用也少很多。
最終結(jié)論
當(dāng)不需要支持字符串換行的時候,請使用Tiny Csv Parser
當(dāng)需要支持字符串換行的時候,請使用CSVHelper
原文地址:?https://www.cnblogs.com/lwqlun/p/9639456.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的.NET Core中的CSV解析库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用.NET Core 2.1的Azur
- 下一篇: 为什么要使用Entity Framewo