我们的客户开始报告从CSV文件导入数据的错误。看到csv文件后,我们决定从自定义CSV解析器切换到CSVHelper,但CSV Helper无法读取某些有效的CSV文件。
用户可以将任何csv文件加载到我们的应用程序中,因此我们不能使用任何类映射器。我们使用csv.Parser.Read来读取string [] dataRows。我们无法改变生成此csv文件的方式,它是由另一家公司生成的,当这个文件的格式有效时,我们无法说服他们更改生成。
如果我们使用BadDataFound处理程序,则context.RawRecord是:
"1000084;SMRSTOVACI TRUBICE PBF 12,7/6,4 (1/2\") H;"
csv文件中的数据行是:
1000084;SMRSTOVACI TRUBICE PBF 12,7/6,4 (1/2") H;;;ks;21,59;26,46;21.00;;;8591735015183;8591735015183;Technik;Kabelový spojovací materiál;Označování, smršťování, izolace;Bužírky, smršťovačky;
这应该是RFC 4180的有效csv文件。
代码是:
using (var reader = new StreamReader(filePath, Encoding.Default))
{
using (var csv = new CsvReader(reader))
{
csv.Read();
csv.ReadHeader();
List<string> badRecord = new List<string>();
csv.Configuration.BadDataFound = context => badRecord.Add(context.RawRecord);
header = csv.Context.HeaderRecord.ToList();
while (true)
{
var dataRow = csv.Parser.Read();
if (dataRow == null)
{
break;
}
data.Add(dataRow);
}
}
}
你能帮我配置CSVHelper,以便能够将这一行加载到string []吗?或者你可以建议不同的解析能够做到吗?
谢谢
我相信这是导致问题的行中间的引用。尝试将配置设置为忽略引号。
using (var reader = new StreamReader(filePath, Encoding.Default))
{
using (var csv = new CsvReader(reader))
{
csv.Configuration.Delimiter = ";";
csv.Configuration.IgnoreQuotes = true;
csv.Read();
csv.ReadHeader();
List<string> badRecord = new List<string>();
csv.Configuration.BadDataFound = context => badRecord.Add(context.RawRecord);
header = csv.Context.HeaderRecord.ToList();
while (true)
{
var dataRow = csv.Parser.Read();
if (dataRow == null)
{
break;
}
data.Add(dataRow);
}
}
}