2015-03-02 35 views
0

所以我試圖修改基於從一個單獨的文件註釋泛化在文本文件中的數據集

的數據集是在.dat文件的形式,看起來像這樣

收購規則Java中的一個數據集

54 59 63 85 86 90 93 98 107 113 Annot_4 Annot_5

39 40 52 55 59 63 85 86 90 93 99 108 114 ANNOT_1 Annot_4 Annot_5

個的綜合規則是這樣的

ANNOT_1,Annot_3 => Annot_X

Annot_2,Annot_5 => Annot_Y

所以基本上我想每一行去了數據集中,並添加如果該行包含來自左側的任何註釋,則使用右側,以便新數據集看起來像這樣:

54 59 63 85 86 90 93 98 107 113 Annot_4 Annot_5 A nnot_Y

39 40 52 55 59 63 85 86 90 93 99 108 114 ANNOT_1 Annot_4 Annot_5 Annot_X Annot_Y

什麼我迄今僅應用第一規則,然後停止。

try { 
     BufferedReader rulesBR = new BufferedReader(new FileReader(generalizationRules)); 
     BufferedReader datasetBR = new BufferedReader(new FileReader(dataset)); 
     String rulesLine; 
     String datasetLine; 
     String parts1[]; 
     String rhs; 
     rulesLine = rulesBR.readLine(); 

     while (rulesLine!=null){ 
      //System.out.println(rulesLine); 
      String parts[] = rulesLine.split("=>"); 
      String lhs[] = parts[0].split(","); 

      rhs = parts[1]; 
      for (String part : lhs){ 
       System.out.println(part); 
       while ((datasetLine =datasetBR.readLine())!=null){  
        parts1 = datasetLine.split("\\S+"); 
        System.out.println(parts1); 
        if (datasetLine.contains(part)) 
         writer.write(datasetLine.concat(rhs)); 
        else 
         writer.write(datasetLine); 
       } 
       ArrayList<String> ruleSetRow = new ArrayList<String>(); 
      } 
      rulesLine =rulesBR.readLine(); 
     } 
     rulesBR.close(); 
     datasetBR.close(); 
    } 

任何幫助將不勝感激。

回答

0

您的代碼有幾個問題。首先,它的結構是錯誤的:你的內循環只運行一次,因爲datasetBR將用完行並且永遠不會倒回,而外循環仍然忙於解析規則。

我會做什麼:

  • 閱讀所有的規則成HashMap<String, String>的左側和右側。 (更好的辦法是使用Guava的HashMultimap,這樣你甚至可以存儲規則的分割版本,但這不是必須的。)
  • 然後在第二個循環中遍歷數據集的所有行(如內循環) 。
  • 對於每一行做一個方法調用findRulesByDatasetLine(rulesMap, datasetLine)。該函數的結果將返回一個帶有找到規則的字符串(例如「Annot_X Annot_Y」)。你可以直接將它連接到行尾並直接寫入你的作者。

功能String findRulesByDatasetLine(Map<String, String> rulesMap, String datasetLine)將通過定義一個空的結果字符串,然後簡單地loop through each entry in the map開始,拆分輸入鍵,如果任何分裂部在datasetLine被發現的入賬價值添加到結果字符串。

希望這會有所幫助。祝你好運!