首页 > 解决方案 > 使用 StringBuilder 将字符串数组列表转换为 CSV 文件的省时方法?

问题描述

我有一个字符串数组列表,我需要有效地将其写入 CSV 文件。我在下面尝试了两种方法。

数据集是一个至少有 100 万条记录的文件。IE。returnedList至少有 100 万个String[]数组。

我当前的代码效率极低,并且使用 StringBuilder 花费的时间太长:

BufferedWriter br = new BufferedWriter(new FileWriter(filePath + "test.csv"));

for(String[] listEntry : returnedList) {
  // convert each array to a string first
  for(String s : listEntry) {
    builder.append(s);
  }
  String str = builder.toString();
  br.write(str);
  br.newLine();
}
br.close();
assertThat(newFirstRow).isNotEmpty();

我的第二次尝试是使用 OpenCsv API:

Writer writer = Files.newBufferedWriter(Paths.get(filePath + "test.csv"));
StatefulBeanToCsv<String[]> beanToCsv = new StatefulBeanToCsvBuilder(writer)
        .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
        .build();
beanToCsv.write(returnedList);

这个方法失败了,不知何故,插入文件的所有记录都是空的。

我是否错误地使用了 OpenCsv 库?

标签: javaexport-to-csvopencsv

解决方案


不要使用 StringBuilder。BufferedWriter 的工作原理是将数据存储在主内存中,并在需要时将其刷新到磁盘上,从而避免频繁的网络访问。你可以试试下面的代码。

for(String[] listEntry : returnedList) {
  for(String s : listEntry) {
    br.append(s);
  }
  br.flush(str);
  br.newLine();
}
//If memory constrain allows Flush everything in one go here and close instead of doing flush() in for loop
br.close();

推荐阅读