我需要解析一个包含很多级别和字符的文本文件。我一直在尝试不同的方法来解析它但我无法得到任何工作。我已经包含了我正在处理的文本文件的示例。关于如何解析这个文件的任何建议?
我用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))))))))
答案 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变体,您只需要将带有开头和结尾双引号的字符串定义更改为单引号,并添加最后包含冒号的元素的定义(我假设它们是字典)。