用Java编写文件解析器的技巧?

时间:2010-01-27 01:59:04

标签: java parsing

编辑:我主要解析“逗号分隔值”,模糊地引起了我的注意。

解释CSV块是这里的主要问题。

我知道如何将文件读取为String[]以及String的一些基本功能,但我不认为使用contains()等方法并分析所有字符按性格将起作用。

我能以更聪明的方式做些什么方法?

一行示例:

-barfoob: boobs, foob, "foo bar"

12 个答案:

答案 0 :(得分:7)

每个人都认为你在谈论XML是有原因的:面对XML解析器的成熟和易用性,发明一种专有的基于文本的文件格式需要非常强大的理由。

你的问题表明你对解析器的了解很少(否则你会写一个ANTLRJavaCC语法而不是问这个问题) - 这是反对滚动的另一个强有力的论据你自己的,除了学习经验。

答案 1 :(得分:6)

由于输入“格式与HTML 类似”,因此您的数据很可能使用树状结构进行最佳表示,而且很可能是XML或类似到XML。

如果是这种情况,我建议解析文件的最聪明方法是使用XML解析器。

以下是您可能会发现有用的一些资源:

HTH

答案 2 :(得分:2)

如果文档是有效的XML,那么任何其他答案都可以。如果不是,你会have to lex

答案 3 :(得分:2)

即使您想自己编写解析器,也应该查看ANTLR,ANTLR是一个很好的选择。或者至少查看YAML

答案 4 :(得分:2)

This并通过维基百科挖掘related articles可能就足够了。

答案 5 :(得分:2)

我认为java.util.Scanner会帮助你。看看http://java.sun.com/javase/6/docs/api/java/util/Scanner.html

答案 6 :(得分:1)

根据您的“架构”的复杂程度,正则表达式可能就是您想要的。如果有很多嵌套,那么转换为XML或JSON并使用预构建的解析器可能最容易。

答案 7 :(得分:1)

人们对标准格式是最佳做法是正确的,但让我们把它放在一边。

假设您给出的示例具有代表性,那么任务就非常简单。

您显示一行,其中包含一个初始标记,用冒号空格标记,然后是逗号分隔值列表。在第一个冒号空间分开,然后在右边的部分使用split()。报价的处理也是微不足道的。

答案 8 :(得分:1)

在查看您的示例输入后,我看不到与HTML或XML有任何相似之处:

-barfoob: boobs, foob, "foo bar"

如果这是您要解析的内容,我有另一个建议,使用Java属性解析器(标准Java附带),然后使用您自己的自定义代码解析每行的其余部分。您需要稍微重构一下您的格式才能使其正常工作,所以这取决于您。

barfoob=boobs, foob, "foo bar"

Java属性将能够返回barfoob作为属性名称,并boobs, foob, "foo bar"作为属性值。您可以使用自定义代码将属性值拆分为boobsfoobfoo bar

答案 9 :(得分:1)

我强烈建议不要重新发明方向并使用现有的解决方案,例如FlatwormFixedformat4jjFFP,它们都可以解析位置或逗号分隔值文件(个人,我推荐Flatworm)。

答案 10 :(得分:0)

您可以在某种程度上使用Neko HTML parser。这取决于它如何处理非标准HTML。

答案 11 :(得分:0)

如果XML有效,我个人更喜欢使用http://www.xom.nu,因为它具有很好的DOM模型。但正如所指出的,J2SE中有解析器。

相关问题