使用StringBuffer值将列添加到CSV文件(Java)

使用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个值的列,因此我正在寻

假设我有一个值为“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个值的列,因此我正在寻找不具有高内存消耗的内容

提前谢谢

编辑:列的大小可能不同。我看到有人说要在每行末尾加上它。问题是,它会将值添加到错误的列中,我不能让这种情况发生。我感谢你们所有人的建议,因为它们非常好

编辑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);
    
    }