【发布时间】:2016-02-26 12:51:05
【问题描述】:
我在我的 .NET C# 项目中使用这个 http://joshclose.github.io/CsvHelper/ 很棒的库来满足我的 CSV 解析要求。
如果我有一个如下所示的 CSV 文件:
SupplierSku,MappedSageSku
EG1234,EGCD1234
EG4567,EG-XZ567
我通常这样创建一个 DTO 类:
public class SkuMapping
{
public string SupplierSku { get; set; }
public string MappedSageSku { get; set; }
}
并像这样解析 csv 文件:
// Open & parse selected csv file
var csvReader = new CsvReader(File.OpenText(selectSkuMapping.Text));
var skuMappings = csvReader.GetRecords<SkuMapping>();
// Do something with each row
foreach (SkuMapping skuMapping in skuMappings)
{
// ...
}
这对于预定义/结构化的 CSV 文件非常有用。
我现在需要解析任意 CSV 文件,其中可能包含各种 column delimiter 和 string enclosure 并且 csv 上的确切列数未知,但包含我需要的数据的列索引是已知的。
示例 #1
PartNumb,InStock,PrGroup
"A-X-1230",Y,103
"B-DD-1231",Y,103
在哪里; column delimiter = , 和 string enclosure = "
我需要的数据:列索引0 (PartNumb) 和列索引1 (InStock)
示例 #2
SupplierSku,CatIds,StockStatus,Active
%ADA-BB-124%|4,5,1|%AV%|1
%XAS-E4-S11%|97,41,65|%OS%|0
在哪里; column delimiter = | 和 string enclosure = %
我需要的数据:列索引0 (SupplierSku) 和列索引2 (StockStatus)
鉴于上述情况,使用 CsvHelper 库解析任意 csv 文件的最佳方法是什么(已知 column delimiter、string enclosure 和 column indexes)?我还需要跳过 csv 第一行的选项(有时 csv 包含标题行,有时它们不包含)。
【问题讨论】:
-
为什么需要使用助手?您当然可以逐行阅读,按分隔符分割并根据需要挑选索引条目的数量?
-
帮助库的存在是为了防止你重新发明轮子。我想既然我已经在我的应用程序中广泛使用了这个库,我会再次使用它来解析任意 csv 文件。这是否意味着
CsvHelper无法满足我的要求?我需要手动解析文件吗? -
根据文档,您可以将其用作阅读器。
-
当您需要快速阅读 CSV 文件时,我发现 lumenworks 很棒。小心使用诸如 split() 之类的字符串操作,因为它们可能导致 outOfMemoryExceptions。见这里:stackoverflow.com/questions/32327971/…
-
Csv 并不那么容易通过行拆分来解析。健壮的代码需要真正的实现。