Сопоставление ошибок с помощником CSV значение одного поля равно нулю

#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 и Email ? 2) Кроме того, он читает все строки? 3) Это Environment.NewLine то, что вы намереваетесь, или так и должно быть "rn" ?

2. да, он читает все строки, и он читает Name и Email . но не читает 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-файлы, соответствующие стандарту, чтобы убедиться, что ваш код работает везде.