Проблема с чтением файла с разделителями каналов с помощью CsvHelper

Я пытаюсь прочитать файл с разделителями каналов без заголовков, используя CsvHelper. Я установил разделитель = "|", установил HasHeaderRecord = false, установил MissingFieldFound = null и IgnoreBlankLines = true. Я заметил, что мой файл содержит пустую строку в конце файла. В моем файле 3 столбца. Я создал объект для помещения этих значений со строковым атрибутом для всех 3. Когда я запускаю свой код, первая переменная содержит все 3 столбца, а другие 2 переменные пусты. Ниже приведен образец файла, который я читаю:

01001001|0.0|0.1200|
01001003|0.0|0.5000|
01008000|1.0|1.9200|
101384|9999.0|0.1000|
103073|9999.0|0.0730|
103074|9999.0|0.1600|
103491|9999.0|0.1460|

Я привожу эту информацию в своем резюме. Я не могу прочитать файл, если у меня нет набора MissingFieldFound. Я получаю следующую ошибку:

«Поле с индексом '1' не существует. Вы можете игнорировать отсутствующие поля, установив для MissingFieldFound значение null».

        using (var textReader = new StreamReader(@processFileName))
        {
            var reader = new CsvReader(textReader);
            reader.Configuration.Delimiter = "|";

            using (var record = new CsvReader(textReader))
            {
                record.Configuration.HasHeaderRecord = false;
                record.Configuration.MissingFieldFound = null;
                record.Configuration.IgnoreBlankLines = true;
                var result3 = record.GetRecords<ItemFileInfo>().ToList();
            }
        }

  public class ItemFileInfo
  {
      public string ItemCode { get; set; }
      public string OnHand { get; set; }
      public string Weight { get; set; }
  }

Я хотел бы иметь возможность правильно проанализировать 3 поля в списке, чтобы я мог внести некоторые изменения в эти значения.

Заранее благодарим вас за любую помощь.


person penahill    schedule 15.07.2019    source источник
comment
Формат файла - 0100100 | 0.0 | 0.1200 | Три записи в строке. Извините за вырезание и вставку   -  person penahill    schedule 15.07.2019


Ответы (1)


Вам необходимо сопоставить столбцы со свойствами вашего класса по индексу.

using (StreamReader reader = new StreamReader(@processFileName))
using (CsvReader csv = new CsvReader(reader))
{
    csv.Configuration.HasHeaderRecord = false;
    csv.Configuration.Delimiter = "|";
    csv.Configuration.RegisterClassMap<ItemFileInfoClassMap>();
    var results = csv.GetRecords<ItemFileInfo>().ToList();
}

public class ItemFileInfo
{
    public string ItemCode { get; set; }
    public string OnHand { get; set; }
    public string Weight { get; set; }
}

public class ItemFileInfoClassMap : ClassMap<ItemFileInfo>
{
    public ItemFileInfoClassMap()
    {
        Map(m => m.ItemCode).Index(0);
        Map(m => m.OnHand).Index(1);
        Map(m => m.Weight).Index(2);
    }
}
person David Specht    schedule 15.07.2019
comment
Спасибо, Дэвид, за ответ. Я попытался удалить замыкающую трубу, добавил к моей модели дополнительное поле с замыкающей трубой. Ни один из них не работал, поэтому у меня все еще та же проблема. - person penahill; 17.07.2019
comment
Это то, что я получаю, отвечая, даже не выполняя его самостоятельно. Я обновил свой ответ решением, которое должно сработать для вас. Это также будет работать, если у вас есть хвостовая труба на каждой линии. - person David Specht; 17.07.2019
comment
Большое спасибо Дэвид. Я никогда не вносил изменений без теста, лол. Я внес ваши изменения, но все еще получаю сообщение об ошибке. Яркая сторона - это другая ошибка :) Ошибка: {Поле с индексом '1' не существует. Вы можете игнорировать отсутствующие поля, установив для MissingFieldFound значение null.} Я проверил свой файл, и все поля заполнены. В конце у меня есть пустая строка, поэтому я добавляю IgnoreBlankLines = true; параметр. - person penahill; 18.07.2019
comment
Работает, если убрать пустую строку в конце или установить IgnoreBlankLines = true? - person David Specht; 18.07.2019