Вопрос по asp.net-mvc, c#, filehelpers – FileHelpers: как пропустить первую и последнюю строку для чтения текста фиксированной ширины

16

Приведенный ниже код используется для чтения текстового файла с содержимым загруженного файла фиксированной ширины с помощью 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[];
  }

Ваш Ответ

3   ответа
0

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

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

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

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

404s на обеих ссылках.
@justSteve: исправлены неработающие ссылки. Документация FileHelpers находится по адресуfilehelpers.net/docs/html/R_Project_FileHelpers.htm
36

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

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

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

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

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

engine.HeaderText
engine.FooterText
Как IgnoreFirst / IgnoreLast по требованию, а не в классе?
engine.Options.IgnoreFirstLines = 1
Спасибо. На самом деле файлы могут быть в двух разных форматах: фиксированная ширина, как описано в вопросе, и в формате записи, где каждое поле находится в отдельной строке. Поля также различаются в обоих форматах, поэтому следует использовать два разных режима чтения. Формат с фиксированной шириной всегда содержит «VV» в начале каждой строки. Как проверить поток перед чтением и применить разные режимы чтения в зависимости от формата? Andrus

Похожие вопросы