【发布时间】:2021-03-26 21:51:09
【问题描述】:
我正在使用 CsvHelper v26.1.0 读取以下由~分隔的文本文件:
123~John
234~Joe "Public"
但是文件中的双引号导致 CsvHelper 将它们视为错误数据。我通过删除双引号对其进行了测试,并且效果很好。但问题是,我已经设置了自定义分隔符,为什么双引号仍然会导致问题?
public class AccountDtoMap : ClassMap<AccountDto>
{
public AccountDtoMap()
{
Map(m => m.Number).Index(0);
Map(m => m.Name).Index(1);
}
}
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = "~",
HasHeaderRecord = false,
MissingFieldFound = (context) => { errs.Add($"{typeof(T)} missing field: {context.Context.Parser.RawRecord}"); },
BadDataFound = (context) => { errs.Add($"{typeof(T)} bad data: {context.RawRecord}"); },
};
using (var csv = new CsvReader(new StreamReader(file), cfg))
{
csv.Context.RegisterClassMap<AccountDtoMap>();
return csv.GetRecords<T>().ToList();
}
可运行的演示 here.
【问题讨论】:
-
双引号是 CsvHelper 用来引用(封装)字段的字符。尝试将双引号加倍(例如
""Public""),或更改引号字符 -
@greenjaed 尝试将引号加倍,但仍然出现同样的错误。
-
抱歉,我的建议不完整。尝试引用整个字段,然后将双引号加倍。
-
您可能会将分隔符与
Escape和/或Quote设置混淆。如果您的单元格包含嵌入的转义字符,您可能需要按照RFC 4180 2.7 转义整个单元格 -
@dbc 将 Escape 和 Quote 字符都更改为
\t后,它起作用了。我很确定源文件不会有标签。