0

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();

前もって感謝します。

4

1 に答える 1

2

明確にするために、成功ファイルに1741レコードがあると言うとき、CSVレコードまたはファイルの行数を数えていますか?改行が埋め込まれたレコードがある可能性があります。つまり、行数を単純に数えることはできません(つまり、これは実際に重複しているのでしょうか、それとも間違って数えているのでしょうか)。

レコード数を自分で維持する代わりに、getRowNumber()書き込まれた行数(ヘッダーを含む)を返すを使用できます。メソッドの最後でこれを呼び出すと、何が返されますか?

successCsvMapWriter.close();
errorCsvMapWriter.close();

System.out.println("Success records (including header): " +
    successCsvMapWriter.getRowNumber());
System.out.println("Error records (including header): " +
    errorCsvMapWriter.getRowNumber());

ああ、これらのステートメントのすべてが必要なわけではありません。flush()を呼び出すと、ストリームがフラッシュされますclose()

于 2012-10-13T00:37:33.450 に答える