使用C#解析复杂文本文件

时间:2010-05-26 17:19:21

标签: c# file parsing

我需要解析一个包含很多级别和字符的文本文件。我一直在尝试不同的方法来解析它但我无法得到任何工作。我已经包含了我正在处理的文本文件的示例。关于如何解析这个文件的任何建议?

我用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 个答案:

答案 0 :(得分:2)

看起来你偶然发现了一个很好的S-Expression文件,也称为LISP代码。它看起来很复杂但实际上很容易解析。事实上,如果你不想学习很多关于Lisp的东西,你可以遵循这些blog posts,其中一小部分是为这样的文件编写解析器。但这可能对你来说太过分了。 :)

相反,你应该使用一个已经可用的S-Expression解析器,这里的项目有一个lisp interpreter的.NET,你应该可以使用他们的代码或他们的项目来解析文件。

lispy要做的就是将文件作为lisp程序读取,而不是“解析”它,你只需要执行它。所以另一个选择就是编写一个小的lisp程序,将文件转换成C#中更自然的东西(也许是XML?)。

供参考,这是另一篇关于lisp in C#

的帖子

修改

here是一个用c语言编写的方案解释器(它只有大约1000个loc),你对read及相关程序感兴趣。这使用了一个非常简单的向前解析的性别表达到c结构树,你应该能够适应C#没问题。

答案 1 :(得分:0)

您可以考虑编写一个状态机实现,根据您在文件中遇到的不同令牌来更改状态。我发现基于状态的解析器很容易编写和调试。最困难的部分可能是定义你使用的令牌。

答案 2 :(得分:0)

使用像ANTLR这样的解析器生成器。它需要类似EBNF的语法描述,并以您选择的语言创建解析器代码。

答案 3 :(得分:0)

一种方法是从帮助解析开始,就像http://www.blackbeltcoder.com/Articles/strings/a-text-parsing-helper-class中描述的那样。然后逐个字符处理文件。这就是我为几个课程所做的。

答案 4 :(得分:0)

我使用OMeta#为C#编写了一个S-Expression解析器。它位于https://github.com/databigbang/SExpression.NET

查看您的S-Expression变体,您只需要将带有开头和结尾双引号的字符串定义更改为单引号,并添加最后包含冒号的元素的定义(我假设它们是字典)。