Я пытаюсь выяснить «правильный» способ разобрать конкретный текстовый файл в Haskell.Разбор текстового файла для печати в Haskell
В F # я прокручиваю каждую строку, проверяя ее на регулярное выражение, чтобы определить, является ли это строкой, которую я хочу проанализировать, а затем, если это так, я анализирую ее с использованием регулярного выражения. В противном случае я игнорирую линию.
Файл представляет собой печатный отчет с заголовками на каждой странице. Каждая запись представляет собой одну строку, и каждое поле разделяется двумя или более пробелами. Вот пример:
MY COMPANY'S NAME
PROGRAM LISTING
STATE: OK PRODUCT: ProductName
(DESCRIPTION OF REPORT)
DATE: 11/03/2013
This is the first line of a a two-line description of the contents of this report. The description, as noted,
spans two lines. This is more text. I'm running out of things to write. Blah.
DIVISION CODE: 3 XYZ CODE: FAA3 AGENT CODE: 0007 PAGE NO: 1
AGENT TARGET NAME ST UD TARGET# XYZ# X-DATE YEAR CO ENCODING
----- ------------------------------ -- -- ------- ---- ---------- ---- ---------- ----------
0007 SMITH, JOHN 43 3 1234567 001 12/06/2013 2004 ABC SIZE XL
0007 SMITH, JANE 43 3 2345678 001 12/07/2013 2005 ACME YELLOW
0007 DOE, JOHN 43 3 3456789 004 12/09/2013 2008 MICROSOFT GREEN
0007 DOE, JANE 43 3 4567890 002 12/09/2013 2007 MICROSOFT BLUE
0007 BORGES, JORGE LUIS 43 3 5678901 001 12/09/2013 2008 DUFEMSCHM Y1500
0007 DEWEY, JOHN & 43 3 6789012 003 12/11/2013 2013 ERTZEVILI X1500
0007 NIETZSCHE, FRIEDRICH 43 3 789/11/2013 2006 NCORPORAT X7
Я первый встроенный анализатор, чтобы проверить каждую строку, чтобы увидеть, если бы это был рекорд. Если бы это была запись, я просто разрезал линию, основанную на позиции символа, с помощью моей подстрочной функции. Это прекрасно работает.
Тогда я обнаружил, что у меня действительно была библиотека регулярных выражений в моей установке Haskell, поэтому я решил попробовать использовать регулярные выражения, как в F #. Это потерпело неудачу, так как библиотека отвергает абсолютно правильные регулярные выражения.
Тогда я подумал: как насчет Parsec? Но кривая обучения для использования этого становится все круче, чем выше я поднимаюсь, и мне кажется, что это правильный инструмент для такой простой задачи, как разбор этого отчета.
Так что я думал, что попрошу некоторых экспертов Haskell: как бы вы решили разобрать этот отчет? Я не прошу код, хотя, если у вас есть, я бы хотел его увидеть. Я действительно прошу техники или технологии.
Спасибо!
P.s. Вывод - это только файл с разделяемым двоеточием с строкой имен полей в верхней части файла, за которыми следуют только записи, которые могут быть импортированы в Excel для конечного пользователя.
Edit:
Спасибо всем большое за большие комментарии и ответы!
Потому что я не дал понять, изначально: первые четырнадцать строк примера повторяются для каждой страницы вывода (печати) с количеством записей, изменяющихся на страницу от нуля до полной страницы (выглядит как 45 записей). Я прошу прощения за то, что раньше этого не делал, поскольку это, вероятно, повлияет на некоторые из уже предложенных ответов.
Система My Haskell в настоящее время ограничена Parsec (у нее нет attoparsec) и Text.Regex.Base и Text.Regex.Posix. Мне нужно будет увидеть установку attoparsec и/или дополнительных библиотек Regex. Но пока вы убедили меня продолжать изучать Parsec. Спасибо за очень полезные примеры кода!
Я бы определенно пошел с Parsec или лучше, attoparsec. Есть ли у вас какие-то особые проблемы? –
Что касается ваших отклонений регулярных выражений, попробовали ли вы как «Text.Regex», так и «Text.Regex.PCRE»? 'Text.Regex' - это теневой пакет' Text.Regex.Posix', который, вероятно, не поддерживает функции, которые вы использовали для использования. PCRE является регулярным выражением perl-esque и имеет расширенное функциональное предложение. –
Для сравнения библиотек Regexp см. Http://www.haskell.org/haskellwiki/Regular_expressions –