2017-09-25 53 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;我