java - 使用 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 库?
解决方案
不要使用 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();
推荐阅读
- react-native - 在解析时间戳时,在 React 本机时刻总是只返回当前日期?
- azure-active-directory - 为非 B2C 用户使用 Graph REST API 从 AAD 检索用户信息
- postgresql - 为什么 postgres 进程在执行 RUN/CMD/ENTRYPOINT 之前不运行?
- jenkins - 使用 Ansible 修改现有 EC2 安全组的 CIDR
- python - For 循环计数器正在内部 while 循环中重置。在 while 循环中显示固定值而不是变化的值
- grid - 开源数据表比纯 HTML5 表快吗?
- mysql - 创建带有子列的 sql 表
- python - 在没有 ArcMap 的 Mac 上使用 python 的 Dijkstra 算法
- catel - ORC.Prims nuget 包已弃用
- amazon-web-services - 如何在 openshift 4 上安装 ansible 运算符