使用快速 CsvReader 读取 CSV 文件,字段周围不带引号

本文关键字:字段 周围不 文件 CSV CsvReader 读取 | 更新日期: 2023-09-27 18:31:47

我在使用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"、"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,因此保持一致会很好。

使用快速 CsvReader 读取 CSV 文件,字段周围不带引号

您必须使用 unicode "null" 字符提供构造函数中未引用字段的信息:

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))
{
    // ...
}