CSVファイルをDBにインポートするWebアプリケーションモジュールを作成しました。インポート プロセスの後、入力ファイル内のレコードの総数、db にインポートされた正常なレコードの総数、拒否されたレコードの総数などの概要が表示されます。ユーザーは成功とエラーの記録をダウンロードして確認できます。
問題は、一部の重複レコードが成功ファイルとエラー ファイルに追加されることです。たとえば、ユーザーは次のようなメッセージを受け取ります。
レコードの総数: 2099正常
なレコードの数: 1694
スキップされたレコードの数: 405
クリックして成功ファイルをダウンロード: Import_20121012184828_success.csv
クリックしてエラー ファイルをダウンロード: Import_20121012184828_errors.csv
データベースを確認すると、テーブル内のレコード数は正確に '1694' です (正常なレコード数と同じです)。ただし、Import_20121012184828_success.csv ファイルには「1741」レコードがあります。しかし、Eclipseコンソールでは、dbと同じように出力されます。つまり、最後の成功レコードの後に重複はありません。したがって、一度ループを終了し、successCsvMapWriter.close(); を呼び出すと、および errorCsvMapWriter.close(); バッファのどこからレコードが追加されているか。私はこれを理解することはできません。
注:少数の入力の場合、問題はまったくありません。バージョン 1.52 および 2.0.0 ベータ版で試しました。
結果のファイルを作成するコードは次のとおりです。
File successFile = new File(csvFileDetails.getSuccessFileUrl());
File errorFile = new File(csvFileDetails.getErrorFileUrl());
// Create result files.
successFile.createNewFile();
errorFile.createNewFile();
String[] header = csvFileDetails.getHeader();
String[] errorFileHeader = ArrayUtils.add(header,
CatalogImportConstanst.CSV_ERROR_HEADER);
// Also tried CsvPreference.STANDARD_PREFERENCE
ICsvMapWriter successCsvMapWriter = new CsvMapWriter(new BufferedWriter(
new FileWriter(successFile)), CsvPreference.EXCEL_PREFERENCE);
ICsvMapWriter errorCsvMapWriter = new CsvMapWriter(new BufferedWriter(
new FileWriter(errorFile)), CsvPreference.EXCEL_PREFERENCE);
successCsvMapWriter.writeHeader(header);
successCsvMapWriter.flush();
errorCsvMapWriter.writeHeader(errorFileHeader);
errorCsvMapWriter.flush();
int errorCount = 0;
int successCount = 0;
for (Map<String, String> csvRecord : csvAsList) {
if (csvRecord.get(CatalogImportConstanst.CSV_ERROR_HEADER) != null
&& csvRecord.get(CatalogImportConstanst.CSV_ERROR_HEADER).trim().length() > 0) {
errorCsvMapWriter.write(csvRecord, errorFileHeader);
errorCsvMapWriter.flush();
errorCount++;
System.out.println("Error record: "+ csvRecord);
} else {
successCsvMapWriter.write(csvRecord, header);
successCsvMapWriter.flush();
successCount++;
System.out.println("Success record: "+ csvRecord);
}
}
successCsvMapWriter.close();
errorCsvMapWriter.close();
前もって感謝します。