【问题标题】:What is the best way to parse a non-flat file format in Java?在 Java 中解析非平面文件格式的最佳方法是什么?
【发布时间】:2013-07-19 20:52:36
【问题描述】:

我正在尝试解析 Java 中的嵌套文件格式。

文件格式如下:

head [

    A [
        property value
        property2 value
        property3 [
            ... down the rabbit hole ...
        ]
    ]

    ... more As ...

    B [
        .. just the same as A
    ]

    ... more Bs ...
]

将其解析到我的程序中的最佳/最简单的技术是什么?

  • 有限状态机?

  • 手动逐字阅读并跟踪我所在的结构的哪一部分?

  • 写一个语法...?

顺便说一句,我无法控制格式 - 因为我知道有人会这么说!

【问题讨论】:

  • 文件元素会递归,类似于XML?
  • @ShamimHafiz 是的,属性可以有属性 - 我将更新我的示例。
  • 希望在内存中得到一个与平面文件结构相匹配的结构(如果您正在解析 XML,则类似于 DOM),或者您希望在看到每个解析的元素时执行操作 [SAX -喜欢]?
  • 我想对每个元素进行操作,我猜是 SAX 一样?

标签: java file parsing format


【解决方案1】:

如果语法确实是这样嵌套的,那么编写一个非常简单的top-down parser 将是一项微不足道的任务:您需要识别的标记非常少,而且嵌套结构可以很方便地重复自己的教科书recursive-descent parser

我什至不会为了这么简单的事情而使用 ANTLR 或其他解析器生成器,因为学习曲线会吃掉项目的潜在好处*


* 学习解析器生成器给您带来的潜在好处难以估量:如果您可以花一两天时间学习使用 ANTLR 构建解析器,那么您对结构化文本文件的看法将永远改变。

【讨论】:

  • 抱歉,我已经更新了我的示例 - 它可以嵌套一段时间。
  • 关于您的编辑,您提到解析器生成器很有趣。如果您查看我的问题历史,您会发现我已经开始学习 Python 中的一个。这个一次性项目似乎有点矫枉过正。
  • @sdasdadas 即时收益与长期收益之间始终存在平衡。 ANTLR 是一个了不起的工具,但需要一些时间来适应。鉴于您的语法只有三个非终结符,对我来说,这有点像使用重型火炮射击苍蝇。
【解决方案2】:

我支持看看 Antlr 的建议。 StAX 添加了类似 SAX 的事件处理。

http://www.antlr.org/wiki/display/ANTLR3/Interfacing+StAX+to+ANTLR

是的,有一个学习曲线,但是当你处理所有奇怪的情况并调试代码时,你可能会收支平衡——而且你的简历上会有一个新项目。

【讨论】:

    【解决方案3】:

    可以说解析此类文件的最简单方法是使用递归下降解析器 (http://en.m.wikipedia.org/wiki/Recursive_descent_parser)。我想这就是您手动读取和跟踪您找到的结构的意思。

    如果您必须能够处理无限嵌套,那么有限状态机将无法工作。如果只有两个级别就足够了。

    编写语法和生成解析器也可以,但是如果您之前没有这样做过或者没有时间学习如何使用这些工具,那可能就有点过头了...

    【讨论】:

      【解决方案4】:

      最快的方法是使用这样的格式,例如JSON 或 YAML。这些格式可以做到这一点并受到支持。

      附带说明,我无法控制格式

      如果您想知道解析 Yaml 等内容的最佳方法,但不是,请阅读简单 Yaml 解析器的代码。

      仅解析文件可能不够,您还需要触发事件或从加载的数据生成数据模型。

      【讨论】:

      • OP 已经说过他无法控制输入格式,所以这个答案没有帮助。
      • @DaleWilson 如果您不费心阅读我的答案,它不会有帮助。我已经解决了他无法更改格式的事实。
      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 2011-12-18
      • 2010-09-14
      • 2010-10-28
      • 2010-09-30
      • 2012-07-02
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多