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

编辑:我主要解析“逗号分隔值”,模糊带来了这个词我的注意。

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

我知道如何将文件读取为String[]String[]一些基本function,但我不认为使用像contains()这样的方法并逐字符地分析所有内容都可行。

有什么方法可以更聪明地做到这一点?

一行示例:

-barfoob: boobs, foob, "foo bar"

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

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

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

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

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

  • 有关Sun解析XML的章节: http : //java.sun.com/developer/Books/xmljava/ch03.pdf
  • 这篇文章可能会帮助您快速入门: http ://onjava.com/pub/a/onjava/2002/06/26/xml.html

HTH

如果文档是有效的XML,那么任何其他答案都将起作用。 如果不是,你必须要lex 。

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

通过维基百科挖掘相关文章可能就足够了。

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

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

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

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

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

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

-barfoob: boobs, foob, "foo bar"

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

barfoob=boobs, foob, "foo bar"

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

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

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

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