我在使用Lumenworks Fast CsvReader时遇到了一些问题。使用代码:
using (CsvReader csv = new CsvReader(new StreamReader(Server.MapPath(fileName)), true))
{
csv.ParseError += csv_ParseError;
while (csv.ReadNextRecord())
{
var importItem = new ProductImportItem(csv);
if (!ProductsDALC.SearchByPartProductCode(importItem.ProductCode).Any())
{
if (!SaveProduct(importItem))
{
this.ParseErrors.Add(string.Format("Failed to add product-{0}", importItem.ProductCode));
}
}
}
}
当使用字段/列值的任一侧使用双引号格式化CSV文件时,代码正常工作,例如:
" product_code"," product_name"," item_description"," sku"," postage_level_required",&# 34; cost_price"," retail_price_inc_vat"
但是,如果列看起来像这样:
PRODUCT_CODE,PRODUCT_NAME,ITEM_DESCRIPTION,SKU,postage_level_required,cost_price,retail_price_inc_vat
然后代码表现得好像没有数据,也就是说,它不会进入while
循环,并且在调试器中枚举结果集将显示它不会产生任何结果。
如果我可以绝对控制数据输入/输出,那就没问题。但是,我所能做的就是为用户提供一个包含字段的模板,并希望它们将数据包装在引号中。这不是一种可接受的方法。
有没有办法让读者解析数据,即使它没有用引号括起来?
我知道内置于.Net中的TextFieldParser类处理这个问题,但由于我们在项目的其他地方使用CsvReader
,因此保持一致会很好。
答案 0 :(得分:1)
您必须使用unicode "null" character提供构造函数中未引用字段的信息:
Char quotingCharacter = '\0'; // means none
Char escapeCharacter = '\0';
Char commentCharacter = '\0';
Char delimiter = ',';
bool hasHeader = true;
using (var csv = new CsvReader(reader, hasHeader, delimiter, quotingCharacter, escapeCharacter, commentCharacter, ValueTrimmingOptions.All))
{
// ...
}