Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义分隔符不使用';我不能在CsvHelper工作_C#_Csv_Csvhelper - Fatal编程技术网

C# 自定义分隔符不使用';我不能在CsvHelper工作

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.

我正在使用CsvHelper v26.1.0读取以下由
~
分隔的文本文件:

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.