java - 使用 SuperCSV 解析器时出现问题

标签 java csv export-to-csv supercsv

我创建了一个 Web 应用程序模块来将 CSV 文件导入数据库。导入过程结束后,用户将显示摘要,例如输入文件中的记录总数、导入到数据库的良好记录总数以及拒绝记录总数。用户可以下载成功和错误记录进行验证。

问题是一些重复的记录被附加到成功和错误文件中。例如用户收到如下消息:

记录总数: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 beta。

以下是创建结果文件的代码:

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

提前致谢。

最佳答案

澄清一下,当您说您的成功文件有 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() 时,流将被刷新。

关于java - 使用 SuperCSV 解析器时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12860435/

相关文章:

java - 如何检查日期和时间戳是在 20 分钟之前

java - Java 基础问题 : String equality

mysql - 将 CSV 文件导入 MySQL 而不使用 load data infile

java - 有没有办法在java中将整数写入文件

export-to-csv - kdb+ : Save table into a csv file

python - 在python中将JSON列表转换为CSV文件

java - 您能否使 Tomcat 6 stdout.log 文件的行为类似于 log4j DailyRollingFileAppender?

java - Fongo 2.1.0 不适用于 Mongo Java 驱动程序 3.2.8

python - json-> csv 使用 in2csv - 指定键不返回任何值

php - 在 PHP 中对逗号分隔值列表运行选择