用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"
作为属性值。 您可以使用自定义代码将属性值拆分为boobs
, foob
和foo bar
。
我强烈建议不要重新发明轮子并使用现有的解决方案,如Flatworm , Fixedformat4j或jFFP ,它们都可以解析位置或逗号分隔值文件(个人而言,我推荐Flatworm)。
您可以在某种程度上使用Neko HTML解析器 。 这取决于它如何处理非标准HTML。
如果XML有效,我个人更喜欢使用http://www.xom.nu,因为它具有很好的DOM模型。 但正如所指出的,J2SE中有解析器。