Java-使用Apache.commons.CSV编写CSV文件



我使用的是Java中的apache.commons.csv库。我正在从一个网页上读取一个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));

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

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

它给出一个

线程"main"java.lang.ArrayIndexOutOfBoundsException异常:1

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

2016-03-04714.9899716.4899706.02002710.8900151967900710.890015,",2016-03-03718.679993719.450012706.02002712.4199831956800712.419983,",2016-03.02719.00720.00712.00718.8499761627800718.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();

Arnaud的答案是正确和好的。这是一个变体,更短更现代。

我们在这里:

  • 使用现代Java提供的PathFileFiles类可以简化文件处理工作
  • 使用BufferedWriter可在处理大量数据时获得更好的性能
  • 指定要使用的字符编码。通常UTF-8是最好的。如果你不明白,请读这篇文章
  • 包括与文件相关的异常所需的尝试捕获
  • 添加"尝试资源"语法以自动关闭文件
  • 跳过显式刷新,因为缓冲写入程序将作为自动关闭BufferedWriterCSVPrinter的一部分自动刷新。引用Javadoc,调用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();
}

编辑:缺少一个括号。

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

相关内容

  • 没有找到相关文章

最新更新