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

用Java编写文件解析器的技巧?,java,parsing,Java,Parsing,编辑:我主要分析“逗号分隔值”,fuzzy引起了我的注意。 解释CSV块是这里的主要问题 我知道如何将文件读入String[]和String的一些基本功能,但我认为使用contains()之类的方法并逐个字符分析所有内容是行不通的 我有哪些方法可以更聪明地做到这一点 行的示例: -barfoob:boobs,foob,“foo-bar”由于输入“格式类似于HTML””,因此您的数据很可能最好使用树状结构来表示,而且很可能是XML或类似于XML 如果是这种情况,我建议最聪明的解析文件的方法是使用X

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

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

我知道如何将文件读入
String[]
String
的一些基本功能,但我认为使用
contains()
之类的方法并逐个字符分析所有内容是行不通的

我有哪些方法可以更聪明地做到这一点

行的示例:

-barfoob:boobs,foob,“foo-bar”

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

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

以下是一些您可能会觉得有用的资源:

  • Sun上关于XML解析的一章:
  • 一篇可能帮助您快速入门的文章:

HTH

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

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

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

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

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


您的问题表明,您对解析器的了解非常少(否则您将编写一个语法或语法,而不是问这个问题),这是另一个强烈反对您自己滚动的论点,除了作为学习经验

即使您想自己编写解析器,也应该查看ANTLR,ANTLR是一个很好的替代方案。或者至少看看《维基百科》,在维基百科中挖掘可能就足够了。

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

假设您给出的示例具有代表性,那么任务就相当简单了


显示带有初始标记的行,用冒号空格取消标记,然后是逗号分隔的值列表。在第一个冒号空格处分开,然后在右边的零件上使用split()。引号的处理也很简单。

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

-barfoob:boobs,foob,“foobar”

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

barfoob=boobs,foob,“foobar”


Java属性可以将
barfoob
作为属性名返回,将
boobs,foob,“foo bar”
作为属性值返回。在这里,您可以使用自定义代码将属性值拆分为
boobs
foob
foobar
,我强烈建议不要重新发明轮子,使用现有的解决方案,例如,或者可以解析位置或逗号分隔的值文件(我个人建议Flatworm).

我认为java.util.Scanner将帮助您。看一看

格式是有效的XML吗?不,我不遵循任何标准,也不打算使用XML;这只会使事情变得不必要的复杂。@Kavon,如果您的输入文件不是XML,那么您可能希望发布输入文件的示例内容,因为解析每个文件的最佳方式取决于您正在解析的内容……等等:您认为使用非标准格式(要求您编写自己的解析器)不会使事情变得不必要的复杂??您不会说这是一个局部示例,如果您想要实际的答案,请发布完整的示例,我仍然认为YAML比尝试创建自己的半生不熟的解决方案更聪明,而且部分示例中的任何内容看起来都不像HTML。数据不是XML,如果是XML,它看起来会很可怕,也不友好。是的,这主要是一种学习体验。专有方面也是非常合理的。添加XML库的首选项到底有什么错呢?哇,我从来没有想过使用扫描仪,谢谢!