我正在尝试读取逗号分隔的 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)
有人可以帮我指出正确的方向吗?
由于该字段"House Name, 20"用引号括起来,因此您应该设置CsvConfiguration.Mode为CsvMode.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)
演示小提琴在这里。
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |