忽略引号内的分隔符 CsvHelper

Sim*_*mon 2 c# csv csvhelper

我正在尝试读取逗号分隔的 csv 文件,除非字段包含逗号,否则该文件在大多数情况下都不是文本限定的。一个例子是可以包含逗号的地址行。当发生这种情况时,列将在我的映射对象内分流。

AddressLine1, Email, ID
House Name, test@test.net, 5
"House Name, 20", test@test.net,5
Run Code Online (Sandbox Code Playgroud)

忽略不好的结果,这会导致对象

[0] AddressLine1: House Name, Email: test@test.net, ID: 5
[1] AddressLine1: House Name, Email: 20, ID: test@test.net
Run Code Online (Sandbox Code Playgroud)

我尝试了各种配置,包括修改模式和转义字符。

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = true,
  Delimiter = ",",                    
  HeaderValidated = null,
  Mode = CsvMode.Escape,
  Escape = '\\'
};
Run Code Online (Sandbox Code Playgroud)

有人可以帮我指出正确的方向吗?

dbc*_*dbc 5

由于该字段"House Name, 20"用引号括起来,因此您应该设置CsvConfiguration.ModeCsvMode.CsvMode.RFC4180 This enum is Defined as less:

public enum CsvMode
{
    /// Uses RFC 4180 format (default).
    /// If a field contains a CsvConfiguration.Delimiter or CsvConfiguration.NewLine,
    /// it is wrapped in CsvConfiguration.Quote's.
    /// If quoted field contains a CsvConfiguration.Quote, it is preceded by CsvConfiguration.Escape.
    RFC4180 = 0,

    /// Uses escapes.
    /// If a field contains a CsvConfiguration.Delimiter, CsvConfiguration.NewLine,
    /// or CsvConfiguration.Escape, it is preceded by CsvConfiguration.Escape.
    /// Newline defaults to \n.
    Escape,

    /// <summary>
    /// Doesn't use quotes or escapes.
    /// This will ignore quoting and escape characters. This means a field cannot contain a
    /// CsvConfiguration.Delimiter, CsvConfiguration.Quote, or
    /// CsvConfiguration.NewLine, as they cannot be escaped.
    NoEscape
}
Run Code Online (Sandbox Code Playgroud)

由于标头字段 Email ID前面有空格,您可能还需要设置TrimOptions = TrimOptions.Trim. 因此你的CsvConfiguration应该看起来像:

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    HasHeaderRecord = true,
    // Delimiter = ",", This is the default so no need to change
    HeaderValidated = null,
    Mode = CsvMode.RFC4180,
    TrimOptions = TrimOptions.Trim,
};      
Run Code Online (Sandbox Code Playgroud)

相关:自定义分隔符在 CsvHelper 中不起作用

演示小提琴在这里