使用StringBuffer值将列添加到CSV文件(Java)
假设我有一个值为“1\n 2\n 3\n…etc”的StringBuffer,其中\n是换行符。 如何使用Java将这些值作为列添加到现有CSV文件中?具体来说,这将是最后一列 例如,假设我有一个如下所示的CSV文件:使用StringBuffer值将列添加到CSV文件(Java),java,csv,stringbuffer,Java,Csv,Stringbuffer,假设我有一个值为“1\n 2\n 3\n…etc”的StringBuffer,其中\n是换行符。 如何使用Java将这些值作为列添加到现有CSV文件中?具体来说,这将是最后一列 例如,假设我有一个如下所示的CSV文件: 5, 2, 5 2, 3, 1 3, 5, 2 .. etc. 在使用将列添加到csv文件的方法后,给定StringBuffer,输出应如下所示: 5, 2, 5, 1 2, 3, 1, 2 3, 5, 2, 3 .. etc. 我还计划添加具有1000个值的列,因此我正在寻
5, 2, 5
2, 3, 1
3, 5, 2
..
etc.
在使用将列添加到csv文件的方法后,给定StringBuffer,输出应如下所示:
5, 2, 5, 1
2, 3, 1, 2
3, 5, 2, 3
..
etc.
我还计划添加具有1000个值的列,因此我正在寻找不具有高内存消耗的内容
提前谢谢
编辑:列的大小可能不同。我看到有人说要在每行末尾加上它。问题是,它会将值添加到错误的列中,我不能让这种情况发生。我感谢你们所有人的建议,因为它们非常好
编辑2:我收到了关于我使用StringBuffer的批评,是的,我同意,如果这个问题是孤立的,我也会建议StringBuilder。此问题的上下文是一个程序,该程序具有同步线程(充当场景)来收集给定范围的并发线程的响应时间。并发线程对数据库执行并发查询,一旦执行了查询,结果将附加到StringBuffer。每个同步线程的所有响应时间都附加到StringBuffer并写入CSV文档。可以有多个线程具有相同的响应时间。我可以使用StringBuilder,但是我必须手动同步附加响应时间的线程,在我的情况下,我认为这不会对性能造成太大的影响,也不会添加不必要的代码。我希望这能有所帮助,我再次感谢大家的关注和建议。如果在阅读本文之后,您仍然不相信我应该使用StringBuffer,那么我请求我们将此讨论脱机
编辑3:我已经解决了如何在行大小不同的情况下添加列的问题。我只是为每个缺少的列添加逗号(还要注意,我的行会随着每列的增加而增加)。看起来@BorisTheSpider的概念解决方案实际上可以与此修改配合使用。问题是我不知道如何在每行末尾添加文本。到目前为止我的代码(我删除了代码以节省空间):
//在此代码之前,有一条语句用于创建test.csv文件(此文件在循环发生之前没有值)。
对于(int p=0;p显然有两个基本要求:
将列附加到现有的CSV
文件
允许并发操作
要达到要求#1,必须将原始文件作为新文件读取和重写,包括新列,而不管其位置如何(即在StringBuffer
或其他位置)
读取CSV
文件的最佳(也是唯一通用)方法是通过成熟且经过现场验证的库,例如,鉴于其Apache 2.0许可证
,它是轻量级且商业友好的库。否则,必须进行许多简化(例如,始终假设单行CSV
记录),或者通过实现新的CSV
解析器来重新发明轮子
无论哪种情况,都需要一个简单的算法,例如:
- 从使用的库(或使用的任何自定义解决方案)初始化
CSV
读取器或解析器对象,提供现有的CSV
文件和必要的参数(例如,字段分隔符)
- 通过读取器或解析器,以
String[]
或List
结构逐条读取输入文件记录
- 操纵为每条记录返回的结构,以添加或删除内存中的任何额外字段(列)
- 如果需要或需要,添加空白字段(即仅额外的分隔符,每个字段1个)
- 使用库中的
CSV
编写器(或手动实现编写器)将新记录写入输出文件
- 在写入输出文件的每条记录的末尾追加一个换行符
- 对原始
CSV
文件中的所有记录重复此操作
这种方法也是可伸缩的,因为它不需要任何重要的内存处理
对于需求#2,有许多支持并发的方法,在这种情况下,以定制的方式(即应用程序中的“手动”)支持并发更为有效,而不是依赖线程安全的数据结构,如StringBuffer
到目前为止您尝试了什么?为什么使用StringBuffer?@Braj我什么都没有尝试过。考虑到Excel最多只支持16000列,我目前的程序将所有内容都存储为列,这是不好的。请在上拆分输入String
<编码>\n
到列表中。循环文件中的行,并将每个列表
元素附加到每行的末尾。写入新文件。@n1234我使用StringBuffer,因为它是线程安全的。
//Before this code there is a statement to create a test.csv file (this file has no values before this loop occurs).
for (int p = 0; p<(max+1); p = p + inc){
threadThis2(p);
//threadThis2 appends to the StringBuffer with several comma delimited values.
//p represents the number of threads/queries to execute at the same time.
comma = p/inc; //how many commas to put if there is nothing on the line.
for (int i = 0; i < comma; i++) {
commas.append(",");
}
br = new BufferedReader (new FileReader("test.csv"));
List <String> avg = Arrays.asList(sb.toString().split(", "));
for (int i = 0; i < avg.size(); i++) {
if (br.readLine()==null)
{w.write(commas.toString() + avg.get(i).toString() + ", \n");}
else { w.write(avg.get(i).toString() + ", \n");}
}
br.close();
sb.setLength(0);
commas.setLength(0);
}