Подтвердить что ты не робот

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[];
  }
4b9b3361

Ответ 1

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

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

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

IgnoreLast. Указывает количество строк, которые должны игнорироваться в конце файла или потока, когда движок читает его.

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

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

engine.HeaderText
engine.FooterText

Ответ 2

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

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

Ответ 3

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

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

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