【问题标题】:Parsing Complex Text File with C#使用 C# 解析复杂的文本文件
【发布时间】:2013-03-24 08:35:56
【问题描述】:

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

我已经用 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))))))))

【问题讨论】:

  • 嗯,你已经尝试了什么?究竟是什么问题?看起来像一个通用的 S-Expr 解析东西,网络上可能已经有一些东西在做这个......
  • 单引号不是结尾单引号,看起来确实有点奇怪
  • 如果您知道生成此文件的工具可能会有所帮助。

标签: c# file parsing


【解决方案1】:

您似乎偶然发现了一个不错的S-Expression 文件,也称为LISP 代码。它看起来确实很复杂,但实际上很容易解析。事实上,如果你不想学习很多关于 Lisp 的知识,你可以关注这些blog posts,其中一小部分是为这样的文件编写解析器。但这对你来说可能有点矫枉过正。 :)

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

lispy 的做法是将文件作为 lisp 程序读取,因此您只需执行它,而不是“解析”它。因此,另一种选择是只编写一个小的 lisp 程序来将文件转换为其他在 C# 中更自然的东西(也许是 XML?)。

这里是另一个关于lisp in C#的帖子供参考

编辑

here 是用 c 编写的方案解释器(它只有大约 1000 loc),您对read 和相关过程感兴趣。这使用了一个非常简单的仅向前解析 sexpression 到 c 结构树的方法,您应该能够将其适应 C# 没问题。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-06-07
            • 2019-07-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-27
            • 2018-11-10
            • 2018-12-25
            • 1970-01-01
            相关资源
            最近更新 更多