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


前言

解析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 字段

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版本是否一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM