假设我有一个以下(非标准)格式的文本文件:
xxx { a = v1; b = v2 } yyy { a = v3; c = v4 }
我无法将其更改为任何标准(INI / XML / YAML等)格式。
现在,我想在a
部分(即xxx
)中找到属性v1
的值。在Java / Groovy中最简单的方法是什么?
答案 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或其他相应的解析器(大部分)工作。
但很可能它不会,你需要编写自己的解析器。有多种方法可以做到这一点,例如:
实际上,正确的选择取决于实际格式的简单性或复杂性。我们无法从一个例子中说出这一点。
答案 2 :(得分:2)
对于真正的INI格式文件:What is the easiest way to parse an INI file in Java?
你在这里展示的内容对我来说更像是JSON而不是INI格式。也许看看JSON解析库。这里的事实是你没有使用已建立的格式,所以你可能不会使用已建立的格式解析器。您最好的选择可能是将您正在处理的文件(如果可能)重构为一个众所周知的格式。除非你绝对必须,否则不要试图重新发明轮子。
答案 3 :(得分:2)
如果你正在处理非标准格式,那么可能不会有一个开箱即用的解决方案。以下是您可能想要研究的几种方法: