使用 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"
,以确保您的代码在任何地方都能正常工作。
我有一个 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"
,以确保您的代码在任何地方都能正常工作。