C# 自定义分隔符不使用';我不能在CsvHelper工作
我正在使用CsvHelper v26.1.0读取以下由C# 自定义分隔符不使用';我不能在CsvHelper工作,c#,csv,csvhelper,C#,Csv,Csvhelper,我正在使用CsvHelper v26.1.0读取以下由~分隔的文本文件: 123~约翰 234~乔“公众” 但文件中的双引号导致CsvHelper将其视为坏数据。我通过删除双引号对其进行了测试,效果很好。但问题是,我已经设置了一个自定义分隔符,为什么双引号仍然会导致问题 public class AccountDtoMap : ClassMap<AccountDto> { public AccountDtoMap() { Map(m => m.
~
分隔的文本文件:
123~约翰
234~乔“公众”
但文件中的双引号导致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();
}
public class AccountDtoMap:ClassMap.要解析问题中显示的CSV(版本),您需要正确配置以下所有设置,而不仅仅是分隔符:
- 。用于在单个CSV行中分隔字段的字符。(通常是
,
,这里是~
)
- ,默认值为
“
。用于在需要转义的其他字符之前添加的字符
- ,默认值为
“
。用于将需要在开头和结尾引用的字段按照换行符换行的字符
- 。解析和写入时要使用的
上述前三个字符设置的功能在以下注释中进行了说明:
当然,如果您这样做,您的CSV文件不能包含嵌入字段中的分隔符或换行符
演示小提琴#1
将Mode=CsvMode.Escape
设置为禁用引号中字段的换行,并将Escape
设置为其他字符,如\
或\t
,这些字符实际上在文件中不会遇到:
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Mode = CsvMode.Escape,
Escape = '\\',
// Remainder unchanged.
即使这样做,CSV字段中的分隔符、转义符和换行符仍必须使用选定的转义符正确转义
演示小提琴2
设置Mode=CsvMode.Escape
并修复文件以正确转义转义字符:
234~乔“公共”
演示小提琴#3
双引号是CsvHelper用于引用(封装)字段的字符。尝试将双引号加倍(例如,“Public”
),或更改引号character@greenjaed尝试将引号加倍,但仍然出现相同的错误。抱歉,我的建议不完整。请尝试引用整个字段,然后将双引号加倍。您可能会将分隔符与和/或设置混淆。如果您的单元格包含嵌入的转义字符,则在将转义字符和引号字符更改为\t
后,可能需要按照@dbc转义整个单元格,这是有效的。我很确定源文件不会有标签。
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Mode = CsvMode.NoEscape,
// Remainder unchanged.
var cfg = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
Mode = CsvMode.Escape,
Escape = '\\',
// Remainder unchanged.