Разбор многострочного текстового файла с фиксированным форматом - PullRequest
6 голосов
/ 30 января 2012

Я пытаюсь проанализировать некоторые данные в текстовом файле с фиксированным форматом, где каждая «запись» распределена по нескольким строкам, например ...

 MAILBOX: 10013      Created: 01/20/09  4:39 pm
    MSGS: 0         UNPLAYED: 0           URGENT: 0          RECEIPT: 0
  LCOS: RBC Standard    : 20            FCOS: RBC Standard      : 20 
  GCOS: Default GCOS 1  : 1             NCOS: Default           : 1 
  TCOS: Default TCOS 1  : 1             RCOS:                   : 1 
BAD LOGS: 0         LAST LOG: NEVER                             MINS:      0.0
  PASSWD: Y            TUTOR: N              DAY: M            NIGHT: M       
    NAME:                                   CODE: 
   EXTEN: 10013                            INDEX: 0
ATTEN DN:                                  INDEX: 0         
DISTRIBUTION LISTS WITH CHANGE RIGHTS:
    all
DISTRIBUTION LISTS WITH REVIEW RIGHTS:
    all

Я использовал File Helpers ранее для однострочных записей, и это было очень полезно. Проверяя документацию, он имеет функцию MultiRecordEngine, но это будет означать ...

  • класс для каждой строки ... не проблема
  • вычисление точного размера каждого поля фиксированного формата ... болезненно и открыто для ошибки
  • логика для проверки каждой строки

И еще одна морщина, которую я обнаружил, это фиксированный формат на самом деле не фиксирован , то есть существуют разные строки формата в зависимости от целевой записи, поэтому некоторые имеют 21 строку, некоторые 22 , 23, 24 и т. Д.

Я нашел библиотеку разбора плоских файлов Java, FFP , но я являюсь .NET, C #, PowerShell кодером

Есть ли лучшие способы обработки этого вида анализа?

Ответы [ 2 ]

4 голосов
/ 30 января 2012

Вам нужен лексер.Ваша запись слишком велика, чтобы использовать один Regex для анализа, поэтому вам нужно написать по одному регулярному выражению для каждой строки и конечный автомат, чтобы проверить, что строки следуют в правильном порядке.

Или вы можете использоватьлексер / парсер общего назначения для генерации кода для вас.В Википедии длинный список .Парсер Gold выглядит хорошим кандидатом.

Я бы не стал выполнять лексинг / синтаксический анализ в PowerShell.Я предпочел бы написать код на C # или F # и использовать сборку из PowerShell.

Редактировать: Я только что посмотрел библиотеку FileHelpers.Вы можете создать Multirecord Engine с типом .NET, который соответствует каждой строке в исходной записи.Все, что вам нужно сделать, это проанализировать массив результатов на предмет правильного порядка и создать объекты.

3 голосов
/ 30 января 2012

Я сделал аналогичное в powershell и обнаружил, что с помощью регулярного выражения в строке здесь работать намного проще:

http://mjolinor.wordpress.com/2012/01/05/powershell-multiline-regex-matching/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...