2017-09-25 26 views
2

openCSVを使用してcsvファイルを開き、すべての列を繰り返し処理しています。ユーザーIDが異なる場合は、ファイルの最後に新しいJavaBeanペアを書き込みます。CSVReaderでファイル全体がチェックされない

問題は、読者がファイル全体ではなく、自分のファイルの最初の列だけをチェックすることです。作成時には、ファイルにはヘッダのみが含まれ、それ以外のものは含まれません。プログラムはすべての列をチェックし、sudoIDが異なっていれば、それをファイルに書き出します。最初の行のsudoIDがメインクラスからインポートされたものと等しい場合、それは認識され、書き込まれません。しかし、この-same- sudoIDが2行目にある場合、それは認識されず、再度書き込まれます。私の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. ますの最初の要素をidとし、32416,
  2. のように入力して、32415と入力してください。
  3. else部分には一致しませんので、ここで新しい患者(あなたのcsvの2番目の行と同じpatIDpseudoID)が作成され、ファイルに保存されます。
  4. これで、あなたはcsvに同じデータの2つのエントリがあるはずです"32415","PAT106663926"

私はあなたのfor loopであなたが一致した場合に対してすべてエントリを確認した後、患者を作成し、CSVファイルにそれを保存する必要があり、これは誤りであると思います。

example:

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; i

関連する問題