FileHelpers: как пропустить первую и последнюю строку при чтении текста фиксированной ширины

Приведенный ниже код используется для чтения текстового файла с загруженным файлом фиксированной ширины с использованием FileHelpers в ASP .NET MVC2.

Длина первой и последней строки меньше, и из-за этого ReadStream вызывает исключение. Все остальные линии имеют правильную фиксированную ширину. Как пропустить первую и последнюю строки или другой способ чтения данных без исключения?

    [FixedLengthRecord()]
    class Bank
    {
        [FieldFixedLength(4)]
        public string AINETUNNUS;
        [FieldFixedLength(16)]
        public string TEKST1;
        [FieldFixedLength(3)]
        public string opliik;
        [FieldFixedLength(2)]
        public string hinnalis;
    };

    [AcceptVerbs(HttpVerbs.Post)]
    [Authorize]
    public ActionResult LoadStatement(HttpPostedFileBase uploadFile)
    {

        FileHelperEngine engine = new FileHelperEngine(typeof(Bank));
        var res = engine.ReadStream(new StreamReader(uploadFile.InputStream,
             Encoding.GetEncoding(1257))) as Bank[];
  }

person Andrus    schedule 12.06.2012    source источник


Ответы (3)


Вы можете использовать эти атрибуты

IgnoreFirst: указывает количество строк, которые будут игнорироваться в начале файла или потока, когда движок читает его.

[IgnoreFirst(1)] 
public class OrdersVerticalBar 
{ ...

IgnoreLast: указывает количество игнорируемых строк в конце файла или потока, когда движок считывает их.

[IgnoreLast(1)] 
public class OrdersVerticalBar 
{ ...

Вы можете получить доступ к значениям позже с помощью

engine.HeaderText
engine.FooterText
person Marcos Meli    schedule 12.06.2012
comment
Спасибо. На самом деле файлы могут быть в двух разных форматах: фиксированной ширины, как описано в вопросе, и в формате записи, где каждое поле находится в отдельной строке. Поля также различаются в обоих форматах, поэтому следует использовать два разных режима чтения. Формат фиксированной ширины всегда содержит VV в начале каждой строки. Как проверить поток перед чтением и применить другой режим чтения в зависимости от формата? - person Andrus; 13.06.2012
comment
engine.Options.IgnoreFirstLines = 1 - person zerohero; 19.04.2016

Вы можете использовать событие BeforeReadRecord, чтобы проверить формат строки. Установите свойство SkipThisRecord в данных события, если это первая запись. Определить, является ли это последней записью, довольно проблематично, но вместо этого вы можете просто проверить длину или формат. Конечно, это предотвратит обнаружение ошибок, вызванных искаженными записями.

Другая возможность — загрузить весь файл в память с помощью File.ReadAllLines. Удалите первый и последний элементы из результирующего массива, снова превратите его в строку, а затем вызовите ЧитатьСтроку. Или вы можете записать строки в MemoryStream и вызвать ReadStream.

person Jim Mischel    schedule 12.06.2012
comment
404 по обеим ссылкам. - person justSteve; 13.06.2017
comment
@justSteve: исправлены неработающие ссылки. Документация FileHelpers находится по адресу filehelpers.net/docs/html/R_Project_FileHelpers.htm. - person Jim Mischel; 13.06.2017

лучше всего украсить свой класс атрибутом [IgnoreFirst].

Если по какой-то причине вы не можете добавить атрибут, вы можете сделать что-то вроде этого

var engine = new FileHelperEngine<T>();
engine.BeforeReadRecord += (e, args) =>
{
    if (args.LineNumber == 1)
        args.SkipThisRecord = true;
};
person Thiago Dantas    schedule 02.02.2018