C# 用C语言解析复杂文本文件#
我需要解析一个包含很多级别和字符的文本文件。我一直在尝试不同的方法来解析它,但我一直没有得到任何工作。我已经包括了我正在处理的文本文件的一个示例。对如何解析此文件有什么建议吗 我已经用TEXTINEED表示了我需要的文件部分C# 用C语言解析复杂文本文件#,c#,file,parsing,C#,File,Parsing,我需要解析一个包含很多级别和字符的文本文件。我一直在尝试不同的方法来解析它,但我一直没有得到任何工作。我已经包括了我正在处理的文本文件的一个示例。对如何解析此文件有什么建议吗 我已经用TEXTINEED表示了我需要的文件部分 (bean name: 'TEXTINEED context: (list '/text '/content/home/left-nav/text '/content/home/l
(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))))))))
您可以考虑编写一个状态机实现,它根据文件中遇到的不同令牌来改变状态。我发现基于状态的解析器非常容易编写和调试。最困难的部分可能是定义您使用的令牌。
看起来您偶然发现了一个不错的文件,也称为代码。它看起来很复杂,但实际上很容易解析。事实上,如果你不想学习很多关于Lisp的知识,你可以学习这些,其中的一小部分就是为这样的文件编写解析器。但这对你来说可能太过分了 相反,您应该使用已经可用的S表达式解析器,这是一个具有for.NET的项目,您应该能够使用它们的代码或它们的项目来解析文件 lispy要做的事情是将文件作为lisp程序读取,这样您就可以执行它而不是“解析”它。因此,另一种选择是只编写一个小的lisp程序,将文件转换成在C#(可能是XML?)中更自然的文件 作为参考,这里有另一篇关于 编辑是一个用c语言编写的方案解释器(大约1000 loc)。您对
读取和相关过程感兴趣。这使用了一个非常简单的sexpression正向解析到一个c结构树中,您应该能够将其改编成c#没问题。使用像ANTLR这样的解析器生成器。它采用类似于EBNF的语法描述,并使用您选择的语言创建解析器代码。一种方法是从辅助解析开始,如中所述。然后逐个字符处理文件。这就是我为几个类所做的。我使用OMeta为C编写了一个S表达式解析器。可于
看看你的S表达式变体,你只需要将我对字符串的定义(以双引号开头和以双引号结尾)改为单引号,并为结尾包含冒号的元素添加定义(我假设这些元素是字典)。好吧,你已经试过什么了?到底是什么问题?看起来像是一个通用的S-Expr解析的东西,网络上可能已经有一些东西在做这件事了……看起来确实有点奇怪,如果你知道是什么工具生成了这个文件,那么单引号不是结束单引号可能会有所帮助。