Java - 使用 Apache.commons.csv 写入 CSV 文件

Java - Write CSV File with Apache.commons.csv

我正在使用 apache.commons.csv library in Java。我正在使用以下代码从网页读取 CSV 文件:

InputStream input = new URL(url).openStream();
        Reader reader = new InputStreamReader(input, "UTF-8");

        defaultParser = new CSVParser(reader, CSVFormat.DEFAULT);
        excelParser = new CSVParser(reader, CSVFormat.EXCEL.withHeader()); 

        defaultParsedData = defaultParser.getRecords();
        excelParsedData = excelParser.getRecords();

但是,我无法在此库中找到一种方法来轻松地将此文件写入我的计算机以便稍后打开并读取它。

我试过这个代码来保存文件。

String outputFile = savePath+".csv";
        CSVPrinter csvFilePrinter = null;
        CSVFormat csvFileFormat = CSVFormat.EXCEL.withHeader();
        FileWriter fileWriter = new FileWriter(outputFile);
        csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat);

        for (CSVRecord csvRecord : excelParser) {
            for(String dataPoint: csvRecord){
                csvFilePrinter.print(dataPoint);
            }
            csvFilePrinter.print('\n');
         }

        fileWriter.flush();
        fileWriter.close();
        csvFilePrinter.close();

但是,当我尝试使用此代码读取文件时,没有打印出任何内容:

InputStream input = new FileInputStream(cvsFilePath);
        Reader reader = new InputStreamReader(input, "UTF-8");

        CSVParser load = new CSVParser(reader, CSVFormat.EXCEL);
        //TEST THAT IT WORKED
        java.util.List<CSVRecord> testlist = load.getRecords();
        CSVRecord dataPoint = testlist.get(0);
        System.out.println("print: " + dataPoint.get(0));

这只会打印出 "print: " 如果我添加

System.out.println("print: " + dataPoint.get(1));

它给出了

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

当我用记事本打开保存的CSV文件时,有一个空行然后:

2016-03-04,714.98999,716.48999,706.02002,710.890015,1967900,710.890015," ",2016-03-03,718.679993,719.450012,706.02002,712.419983,1956800,712.419983," ",2016-03-02,719.00,720.00,712.00,718.849976,1627800,718.849976,"

您似乎在同一行打印所有记录。

printRecords 等其他方法会更有帮助:

String outputFile = savePath+".csv";
CSVPrinter csvFilePrinter = null;
CSVFormat csvFileFormat = CSVFormat.EXCEL.withHeader();
FileWriter fileWriter = new FileWriter(outputFile);
csvFilePrinter = new CSVPrinter(fileWriter, csvFileFormat);

csvFilePrinter.printRecords(excelParser.getRecords());


fileWriter.flush();
fileWriter.close();
csvFilePrinter.close();

您是否尝试刷新并关闭 CSVPrinter,而不是 FileWriter?

是正确的,很好。这是一个变体,更短更现代。

这里我们:

  • 使用现代 Java 提供的 Path, File, and Files 类 来简化 file-handling 的工作。
  • 使用 BufferedWriter 以获得更好的处理大量数据的性能。
  • 指定 character encoding to be used. Usually UTF-8 is the best. If you do not understand, read this.
  • 为 file-related 例外包括必要的 try-catches
  • try-with-resources 语法添加到 auto-close 文件。
  • 跳过显式刷新,因为缓冲写入器将作为 auto-closing BufferedWriterCSVPrinter 的一部分自动刷新。引用 Java 文档,调用 java.io.Writer::close “关闭流,首先刷新它。”。

代码:

CSVFormat format = CSVFormat.EXCEL.withHeader();
Path path = Paths.get( savePath + ".csv" );
try (
        BufferedWriter writer = Files.newBufferedWriter( path , StandardCharsets.UTF_8 ) ;
        CSVPrinter printer = new CSVPrinter( writer , format ) ;
)
{
    printer.printRecords( excelParser.getRecords() );
} catch ( IOException e )
{
    e.printStackTrace();
}

编辑:缺少括号。