如何解析类似INI / JSON的非标准格式的文件?

时间:2012-01-17 15:43:29

标签: java parsing groovy

假设我有一个以下(非标准)格式的文本文件:

xxx { a = v1; b = v2 }
yyy { a = v3; c = v4 } 

我无法将其更改为任何标准(INI / XML / YAML等)格式。

现在,我想在a部分(即xxx)中找到属性v1的值。在Java / Groovy中最简单的方法是什么?

4 个答案:

答案 0 :(得分:3)

使用Groovy,您可以利用ConfigSlurper。

但是,您首先需要一起破解有效值的映射,以便它不会阻止尝试找出v1, v2, v3, etc的内容:

这似乎有效:

def input = '''xxx { a = v1; b = v2 }
              |yyy { a = v3; c = v4 }'''.stripMargin()

def slurper = new ConfigSlurper()

// Find all words 'w' and make a map of [ w1:'w1', w2:'w2', ... ]
slurper.binding = ( ( input =~ /\w+/ ) as List ).collectEntries { w -> [ (w):w ] }

def result = slurper.parse( input )
println result

打印出来:

[xxx:[a:v1, b:v2], yyy:[a:v3, c:v4]]

(Groovy 1.8.4)

答案 1 :(得分:3)

首先,您已经给出了一个示例,未指定格式。在继续之前,您需要掌握格式的完整规范。或者如果没有,则需要查看生成它的代码,并对规范进行反向工程。

(如果您尝试基于一个小例子来实现,那么您的解析器很可能会遇到不符合您所直接模式的现实生活示例。)

完成后,您可以寻找可以处理您的格式的现成解析器。如果你很幸运,它可能足够接近INI,或JSON或YAML或其他相应的解析器(大部分)工作。

但很可能它不会,你需要编写自己的解析器。有多种方法可以做到这一点,例如:

  • 您可以将文件拆分为行,并使用正则表达式“解析”每一行。
  • 您可以使用具有适当分隔符的扫描仪解析文件。
  • 您可以使用解析器生成器来实现词法分析器和解析器。
  • 您可以手动实现一个简单的词法分析器和解析器。
  • 可能有Groovy特定的解决方案。

实际上,正确的选择取决于实际格式的简单性或复杂性。我们无法从一个例子中说出这一点。

答案 2 :(得分:2)

对于真正的INI格式文件:What is the easiest way to parse an INI file in Java?

你在这里展示的内容对我来说更像是JSON而不是INI格式。也许看看JSON解析库。这里的事实是你没有使用已建立的格式,所以你可能不会使用已建立的格式解析器。您最好的选择可能是将您正在处理的文件(如果可能)重构为一个众所周知的格式。除非你绝对必须,否则不要试图重新发明轮子。

答案 3 :(得分:2)

如果你正在处理非标准格式,那么可能不会有一个开箱即用的解决方案。以下是您可能想要研究的几种方法:

  • 如果格式很简单,请编写自定义recursive descent parser
  • 编写一个过滤器,将您的格式转换为INI,JSON等,并使用现有的库
  • 创建与您的格式匹配的groovy DSL并将文件作为groovy脚本执行
  • 使用像antlrparboiled这样的解析器生成器工具从语言规范中创建解析器