2017-09-25 51 views
2

我嘗試使用openCSV csv文件,每列遍歷,如果用戶ID是不同的文件的末尾寫一個新的JavaBean對。CSVReader不檢查整個文件

的問題是,讀者只檢查我的文件的第一列,而不是整個文件。在創建時,該文件只包含一個標題,而沒有其他內容。該程序將檢查每一列,如果sudoID不同,它會將其寫入文件。如果在第一行的sudoID等於一個從我的主類進口會識別它,並把它寫。但是,如果這個同名sudoID在第二行,它將不會識別它並將再次寫入。

舉例來說,如果我的CSV看起來像這樣它會工作:

"Patient_id Pseudo_ID", 
"32415","PAT106663926" 

如果它看起來像這樣將重新寫sudoID:

"Patient_id Pseudo_ID", 
"32416","PAT104958880" 
"32415","PAT106663926" 

謝謝! 我的代碼:

public class CSVConnection { 

@SuppressWarnings({ "deprecation", "resource", "rawtypes", "unchecked" }) 
public String getID(String sID,String pseudoID) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException{ 
    try { 
    CsvToBean csv = new CsvToBean(); 
    String csvFilename = "CsvFile.csv"; 
    Writer writer= new FileWriter(csvFilename,true); 
    CSVReader csvReader = new CSVReader(new FileReader(csvFilename),',','"',1); 

     ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); 
     strategy.setType(PatientCSV.class); 
     String[] columns = new String[] {"patID","pseudoID"}; 
     strategy.setColumnMapping(columns); 
    //Set column mapping strategy 
     StatefulBeanToCsv<PatientCSV> bc = new StatefulBeanToCsvBuilder<PatientCSV>(writer).withMappingStrategy(strategy).build(); 
     List patList = csv.parse(strategy, csvReader); 

     for (Object patObj : patList) { 

      PatientCSV pat = (PatientCSV) patObj; 
      if(((PatientCSV) patObj).getPatID().equals(sID)){ 

       return pat.getPseudoID(); 
      } 
      else 
      { 

       PatientCSV pat1 = new PatientCSV(); 
       pat1.setPatID(sID); 
       pat1.setPseudoID(pseudoID); 
       patList.add(pat1); 
       /*Find a way to import it to the CSV*/ 
       bc.write(pat1); 
       writer.close(); 
       return pseudoID; 
      } 
     } 


} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 

} 
    return null; 


} 




public static void main(String [] args) throws IOException, CsvDataTypeMismatchException, CsvRequiredFieldEmptyException{ 
    CSVConnection obj = new CSVConnection(); 
    String sID="32415"; 
    String pseudoID="PAT101830150"; 
    obj.getID(sID,pseudoID); 
} 

}

和Java Bean的:

public class PatientCSV { 
private String patID; 
private String pseudoID; 


public String getPatID() { 
    return patID; 
} 


public void setPatID(String patID) { 
    this.patID = patID; 
} 


public String getPseudoID() { 
    return pseudoID; 
} 


public void setPseudoID(String pseudoID) { 
    this.pseudoID = pseudoID; 
} 


public PatientCSV(String patID, String pseudoID) { 
    super(); 
    this.patID = patID; 
    this.pseudoID = pseudoID; 
} 


public PatientCSV() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 


public String toString() 
    { 
     return "Patient [id=" + patID + ", pseudoID=" + pseudoID + "]"; 
    } 

}

+0

請不要只是壓制所有這些警告。他們在那裏是爲了一個*好的理由,即你應該解決和修復它們。 – QBrute

+0

@QBrute好點。我打算在找到我的問題的解決方案後改變這一點。感謝您的建議。 –

回答

1

讓檢查你for loop

for (Object patObj : patList) { 

     PatientCSV pat = (PatientCSV) patObj; 
     if(((PatientCSV) patObj).getPatID().equals(sID)){ 

      return pat.getPseudoID(); 
     } 
     else 
     { 

      PatientCSV pat1 = new PatientCSV(); 
      pat1.setPatID(sID); 
      pat1.setPseudoID(pseudoID); 
      patList.add(pat1); 
      /*Find a way to import it to the CSV*/ 
      bc.write(pat1); 
      writer.close(); 
      return pseudoID; 
     } 
    } 

所以在如果您提及該工作不正常,這意味着你的輸入相匹配的行是第二行:

"Patient_id Pseudo_ID", 
"32416","PAT104958880" 
"32415","PAT106663926" 

所以你撥打:getID("32415", "PAT106663926") 在你的循環會發生什麼事是:

  1. 你把你的csv患者的第一個元素,一個具有id32416
  2. 檢查其是否與給定的輸入到你的方法,32415id匹配。
  3. 不匹配,所以它去else部分。在那裏,它會創建新的患者(具有相同的patIDpseudoID爲您的CSV的第2排),並將其存儲在文件中。
  4. 所以現在你應該在使用相同的數據"32415","PAT106663926"您的CSV 2項。

我認爲這是錯誤,在你for loop你應該檢查對所有項,如果有一個匹配,然後創建患者,並將其存儲到CSV。

一個例子:

PatientCSV foundPatient = null; 
for (Object patObj : patList) { 

    PatientCSV pat = (PatientCSV) patObj; 
    if(((PatientCSV) patObj).getPatID().equals(sID)){ 
     foundPatient = pat; 
    } 
} 

if (foundPatient == null) { 
    foundPatient = new PatientCSV(); 
    foundPatient.setPatID(sID); 
    foundPatient.setPseudoID(pseudoID); 
    patList.add(foundPatient); 
    /*Find a way to import it to the CSV*/ 
    bc.write(foundPatient); 
    writer.close(); 
} 

return foundPatient.getPseudoID(); 

P.S.上面的例子寫得很快,只是爲了讓你明白需要做什麼。

+1

非常感謝。這正是我認爲這將是問題。偉大的迴應和非常分析。 –

+1

測試和工作真棒。我試圖做一個for(int i = 0;我