2015-12-09 51 views
0

我得到了需要解析的文本文件,我正在尋找更有效的方法來完成它。使用Java閱讀和解析文本文件

文件結構是已知的,看起來像這樣:

[section] 
key=value 
key=value 

[section] 
key=value 

[section] 
key=value 

我有沒有辦法事先知道有多少[第]我會讀,也沒有多少關鍵&值出現在每個部分。

我正試圖找到將此文件存儲在集合中的最佳方法。到目前爲止,我認爲最好的集合tu的使用將是一個Map>,這樣每個[section]都會有相關的鍵值。

我遇到的問題主要是處理空行,因爲我在尋找新的部分用一個簡單的:

if(line.charAt(0) == '[') 

,顯然,對於空白行則返回null。

任何人都可以讓我知道嗎?

+1

值你可以例如正則表達式匹配線路,看看它一)新的部分,B)空白, c)key =值 – Jan

+6

爲什麼不檢查線的長度?如果它是'0',你有一個空行。 – gonzo

+3

如果'空'行可以包含空格或製表符,請不要忘記修剪()您的字符串 – StephaneM

回答

0

使用HashMap存儲一個節的鍵值對。還有一個Hashmap用於存儲節名稱和Key Value哈希圖。 然後閱讀並檢查它是否是一個新的正則表達式部分。如果是這樣,則爲Key Value對創建一個具有Name和New HashMap的新條目。如果不是通過「=」標記分割行,並將實際的部分hashmap放入新的鍵值對。如果沒有找到正則表達式,並且分割不會導致兩個部分,那麼它既不是新節,也不是Key Value,並且該行將被解散。

HashMap<String,HashMap<String,String>> sections = new HashMap<>(); 
BufferedReader br = new BufferedReader(new FileReader(new File(filename))); 
String line = ""; 
HashMap<String,String> actualSection = null; 
Pattern p = Pattern.compile("\\[(.*?)\\]"); // regex pattern for brackets 
while ((line = br.readLine()) != null) { 
    Matcher m = p.matcher(line); 
    if(m.find()){ 
     // found regex means new section 
     actualSection = new HashMap<String,String>(); 
     sections.put(m.group(1), actualSection); 
    } else{ 
     // read in new key Value pairs 
     String[] parts = line.split("="); 
     if(parts.length == 2 && actualSection != null){      
      actualSection.put(parts[0],parts[1]); 
     }      
    } 
} 

之後,你已經存儲在部分所需的變量,你可以得到所需的與

System.out.println(sections.get(SECTIONNAME).get(KEYNAME)); 
+0

工程就像一個魅力。我已經得到了HashMap的HashMap思想,但在處理段落末尾的空行時遇到了麻煩。 – aur8l