使用 CSV 助手进行错误映射,一个字段的值为空

Error mapping with CSV helper the value of one field is null

我有一个 CSV 文件,格式如下:

Name,Email,ClientCode
Ch S,auseremail@gmail.com,20210603241
HJ BA,buseremail@gmail.com,20210603261

我正在使用 CsvHelper 读取 CSV 文件。当我在本地环境调试代码时,数据正确绑定到模型。

但是当我将代码部署到生产环境时,ClientCode的值为零或空

Class 我正在使用:

public class ClientEmail
{
    [Name("Email")]
    public string Email { get; set; }
    [Name("ClientCode")]
    public long ClientCode { get; set; }
    [Name("Name")]
    public string Name { get; set; }
}

public class ClientEmailMap : ClassMap<ClientEmail>
{
    public ClientEmailMap()
    {
        Map(m => m.Name).Name("Name");
        Map(m => m.Email).Name("Email");
        Map(m => m.ClientCode).Name("ClientCode");
    }
}

读取 CSV 文件并将其绑定到模型的代码:

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    NewLine = Environment.NewLine,
    Delimiter = ",",
    HeaderValidated = null,
    MissingFieldFound = null,
    IgnoreBlankLines = false,
    HasHeaderRecord = true
};


string path = Path.Combine(_env.WebRootPath, $"csv/{fileName}");

var reader = new StreamReader(Path.Combine(_env.WebRootPath, $"csv/{fileName}"));


using (var csv = new CsvReader(reader, config))
{
        var records = await csv.GetRecordsAsync<ClientEmail>().ToListAsync();
}

这里的记录中,ClientCode的值始终为null。所以我将 属性 类型从 string 更改为 long,但值还是 0.

CSV 文件规范 RFC 4180 规定

Each record is located on a separate line, delimited by a line break (CRLF).

注意 CRLF = "\r\n".

如果您使用的是 .NET Core,则可以 运行 您的代码在默认换行符序列仅为 LF 的操作系统上运行,例如Linux 或 Mac,因此 Environment.NewLine 将不是正确的换行设置,并且数字末尾会有一个 CR 字符,这可能导致将它们解析为数字失败.

解决方案是对符合标准的 CSV 文件使用 NewLine = "\r\n",以确保您的代码在任何地方都能正常工作。