Разбор сложного текстового файла с помощью C # - PullRequest
1 голос
/ 26 мая 2010

Мне нужно проанализировать текстовый файл, который имеет много уровней и символов. Я пробовал разные способы разобрать его, но я не смог заставить что-либо работать. Я включил образец текстового файла, с которым я имею дело. Любые предложения о том, как я могу разобрать этот файл?

Я обозначил части файла, которые мне нужны, с помощью TEXTINEED.

(bean name:
       'TEXTINEED
       context:
       (list '/text
             '/content/home/left-nav/text
             '/content/home/landing-page)
       type:
       '/text/types/text
       module:
       '/modules/TEXTINEED
       source:
       '|moretext|
       ((contents
          (list (list (bean type:
                             '/directory/TEXTINEED
                             ((directives
                                (bean ((chartSize (list 600 400))
                                        (showCorners (list #f))
                                        (showColHeader (list #f))
                                        (showRowHeader (list #f)))))))
                      (bean type:
                             '/directory/TEXTINEED
                             ((directives
                                (bean ((displayName (list "MTD"))
                                        (showCorners (list #f))
                                        (showColHeader (list #f))
                                        (showRowLabels (list #f))
                                        (hideDetailedLink (list #t))
                                        (showRowHeader (list #f))
                                        (chartSize (list 600 400)))))))
                      (bean type:
                             '/directory/TEXTINEED
                             ((directives
                                (bean ((displayName (list "QTD"))
                                        (showCorners (list #f))
                                        (showColHeader (list #f))
                                        (showRowLabels (list #f))
                                        (hideDetailedLink (list #t))
                                        (showRowHeader (list #f))
                                        (chartSize (list 600 400))))))))

Ответы [ 5 ]

2 голосов
/ 27 мая 2010

похоже, что вы наткнулись на хороший S-Expression файл, также известный как LISP код. Это выглядит сложным, но на самом деле его довольно легко разобрать. На самом деле, если вы не хотите много узнавать о Лиспе, вы можете следить за этими сообщениями в блоге , небольшая часть которых напишет парсер для таких файлов. Но это, наверное, излишне для тебя. :)

вместо этого вы должны использовать уже доступный синтаксический анализатор S-Expression, здесь проект, который имеет интерпретатор lisp для .NET, вы должны иметь возможность использовать их код или их проект для разбора файла.

Самое простое, что нужно сделать, это просто прочитать файл как программу lisp, так что вместо его "разбора" вы просто запустите его. Так что другой вариант - написать небольшую программу на lisp, чтобы преобразовать файл во что-то более естественное в C # (может быть, в XML?).

для справки вот еще один пост, в котором говорится о lisp в C #

EDIT

здесь - интерпретатор схемы, написанный на c (его всего около 1000 loc), который вас интересует read и связанных с ним процедур. при этом используется очень простой синтаксический анализ только в прямом направлении в дерево структур c, вы должны иметь возможность адаптировать его в C # без проблем.

0 голосов
/ 24 марта 2013

Я написал синтаксический анализатор S-Expression для C #, используя OMeta #. Это доступно в https://github.com/databigbang/SExpression.NET

Глядя на ваш вариант S-Expression, вам просто нужно изменить мое определение строки с открывающими и заканчивающими двойные кавычки на одну кавычку и добавить определение для элементов, которые содержат двоеточие в конце (я предполагаю, что это словари).

0 голосов
/ 23 декабря 2010

Один из подходов состоит в том, чтобы просто начать с синтаксического анализа, как описано в http://www.blackbeltcoder.com/Articles/strings/a-text-parsing-helper-class., а затем обрабатывать файл символ за символом. Это то, что я сделал для нескольких классов.

0 голосов
/ 29 мая 2010

Используйте генератор синтаксического анализатора, такой как ANTLR. Он берет описание грамматики в стиле EBNF и создает код синтаксического анализатора на выбранном вами языке.

0 голосов
/ 26 мая 2010

Возможно, вы захотите написать реализацию конечного автомата, которая изменяет состояния в соответствии с различными токенами, которые встречаются в файле. Я обнаружил, что основанные на состоянии парсеры довольно просты в написании и отладке. Наиболее трудной частью, вероятно, будет определение используемых вами токенов.

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