在Java中解析非平面文件格式的最佳方法是什么?

时间:2013-07-19 20:52:36

标签: java file parsing format

我试图用Java解析嵌套文件格式。

文件格式如下:

head [

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

    ... more As ...

    B [
        .. just the same as A
    ]

    ... more Bs ...
]

将此解析为我的程序的最佳/最简单的技术是什么?

  • 有限状态机?

  • 逐字逐句地手写,并跟踪我所在的结构的哪个部分?

  • 写一个语法......?

作为旁注,我无法控制格式 - 因为我知道有人会说出来!

4 个答案:

答案 0 :(得分:2)

如果语法确实是这样嵌套的,那么编写一个非常简单的top-down parser将是一项微不足道的任务:您只需要很少的令牌来识别,并且嵌套结构可以非常方便地为教科书重复{{3} }。

我甚至不愿意使用ANTLR或其他解析器生成器这么简单,因为学习曲线会占用项目 * 的潜在好处。

<小时/> * 学习解析器生成器的潜在好处很难被高估:如果你可以花一两天时间学习使用ANTLR构建解析器,你对结构化文本文件的看法将永远改变。

答案 1 :(得分:1)

我接下来的建议是看看Antlr。 StAX增加了类似SAX的事件处理。

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

最快的方法是使用这样的格式,例如JSon或YAML。这些格式执行此操作并受支持。

  

作为旁注,我无法控制格式

如果你想知道解析像Yaml这样的东西的最佳方法,那就是阅读一个简单的Yaml解析器的代码。

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