#c# #csv #csvhelper
Вопрос:
У меня есть файл CSV в следующем формате:
Name,Email,ClientCode
Ch S,auseremail@gmail.com,20210603241
HJ BA,buseremail@gmail.com,20210603261
Я использую CSVHelper для чтения CSV-файла. Когда я отлаживаю код в локальной среде, данные должным образом привязываются к модели.
Но когда я развертываю код в рабочей среде, значение ClientCode
равно нулю или нулю.
Класс, который я использую:
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
всегда равно нулю. Поэтому я изменил тип свойства на long
от string
, но снова значение равно 0.
Комментарии:
1. 1) Вы хотите сказать, что он извлекает правильные значения для
Name
иEnvironment.NewLine
то, что вы намереваетесь, или так и должно быть"rn"
?2. да, он читает все строки, и он читает
Name
иClientCode
3. Находится
Environment.NewLine
=="rn"
в производственной среде? Например, это не было бы в Linux или Mac. Если в числовой части была задержка из-заr
того, что CSVHelper использовал неправильную настройку новой строки, это может привести к сбою синтаксического анализа.4. Я использую heroku.com чтобы разместить мое приложение, возможно, оно использует Linux.
5. итак, я должен изменить свой старый код на новую строку = «rn»?
Ответ №1:
В спецификации для CSV-файлов, RFC 4180, говорится, что
Каждая запись расположена в отдельной строке, разделенной разрывом строки (CRLF).
Обратите внимание, что CRLF = "rn"
.
Если вы используете .NET Core, вы можете запустить свой код в операционной системе, в которой последовательность символов новой строки по умолчанию просто LF, например, в Linux или Mac, поэтому Environment.NewLine
будет неправильной настройкой новой строки, и в конце цифр будет символ CR, что может привести к сбою их разбора на число.
Решение состоит в том, чтобы использовать NewLine = "rn"
CSV-файлы, соответствующие стандарту, чтобы убедиться, что ваш код работает везде.