簡體   English   中英

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

[英]How to parse a file in INI/JSON-like non-standard format?

假設我有以下(非標准)格式的文本文件:

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

我無法將其更改為任何標准(INI / XML / YAML等)格式。

現在,我想在xxx節(即v1 )中找到屬性a的值。 在Java / Groovy中最簡單的方法是什么?

使用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)

首先,您給出了一個示例,未指定格式。 在繼續之前,您需要掌握該格式的完整規范。 或者,如果沒有,則需要查看生成它的代碼,並對規范進行反向工程。

(如果您嘗試根據一個小例子來實現,那么解析器很有可能會遇到不符合您直覺的模式的現實例子。)

完成后,您可以尋找可以處理您的格式的現成解析器。 如果幸運的話,它可能與INI,JSON或YAML或其他足夠接近的解析器足夠接近(主要)起作用。

但是很有可能它不會,並且您將需要編寫自己的解析器。 您可以通過多種方式執行此操作,例如:

  • 您可以將文件分成幾行,然后使用正則表達式“解析”每一行。
  • 您可以使用帶有適當定界符的掃描儀來解析文件。
  • 您可以使用解析器生成器來實現詞法分析器和解析器。
  • 您可以手動實現一個簡單的詞法分析器和解析器。
  • 可能有Groovy特定的解決方案。

實際上,正確的選擇取決於實際格式的簡單程度。 我們不能從一個例子中看出這一點。

對於真正的INI格式的文件: 用Java解析INI文件的最簡單方法是什么?

在我看來,您在這里顯示的內容更像是JSON,而不是INI格式。 也許看看JSON解析庫。 事實是您沒有使用已建立的格式,因此您可能不會使用已建立的格式解析器。 最好的選擇是將正在處理的文件(如果可能)重構為眾所周知的格式。 除非絕對必要,否則不要嘗試重新發明輪子。

如果要處理非標准格式,可能不會有現成的解決方案。 您可能需要研究以下幾種方法:

  • 如果格式簡單,請編寫自定義遞歸下降解析器
  • 編寫過濾器以將格式轉換為INI,JSON等,並使用現有的庫
  • 創建與您的格式匹配的Groovy DSL並以Groovy腳本執行文件
  • 使用antlrparboiled之類的解析器生成器工具根據語言規范創建解析器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM