2012-10-12 20 views
0

我已經創建了一個Web應用程序模塊來將CSV文件導入到數據庫。導入過程之後,用戶將顯示摘要,例如輸入文件中的記錄總數,導入到db的良好記錄總數以及被拒絕的記錄總數。用戶可以下載成功和錯誤記錄進行驗證。使用SuperCSV分析器時出現問題

問題是一些重複記錄被追加到成功和錯誤文件。

記錄總數:2099
的良好記錄數:1694
跳過的記錄數:405
點擊下載成功文件:Import_20121012184828_success.csv
點擊例如,用戶如下得到一個消息要下載錯誤文件:Import_20121012184828_errors.csv

當我們檢查db時,表中記錄的數量正好是'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(); 

在此先感謝。

回答

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()流將被刷新。

+0

問題出在下載部分,而不是解析器,我忙於另一個任務,因此延遲迴應。請原諒我的愚蠢。 – Leejoy