在循环java中的多个列中写入CSV

时间:2014-04-02 22:44:07

标签: java csv file-io

我正在尝试将两列数组写入.csv文件。该数组具有任意数量的列,范围从几个到几千个。目前我有代码将单个数组写入.csv文件,如下所示。 generateCSV方法中的参数n表示循环中的点,从n = 1开始。

public class MakeCSVFile {

public static void generateCSV(File myFile, double[][] ProtonTracking,int n) throws IOException{
    PrintWriter pw = new PrintWriter(new FileWriter(myFile));
    pw.print(String.format("Trial Number :, %d\n",  n));
    for(int i= 0; i < Array.getLength(ProtonTracking); i++) {
      pw.print(String.format("%f, %f%n", ProtonTracking[i][0], ProtonTracking[i][1]));
    }
    pw.flush();  
    pw.close(); 
    }
}

此代码将第一个数组正确写入.csv文件,n = 1。但是,对于n = 2时循环的下一阶段,数组写入的位置与n = 1相同,因此只有最近的arrray才会保存到.csv文件中。我想告诉这个方法在n = 1的数组旁边的两列中写入n = 2的数组。所以最后.csv文件包含所有n的数组。

换句话说,对于n = 2,我想开始写入第3列中的.csv文件,而不是第1列。我尝试使用键入循环的逗号来完成此操作,例如:

for(int k= 0; k<n; k++) {
      pw.print(String.format(", ,");
    }

但这会覆盖所有以前的列。

1 个答案:

答案 0 :(得分:1)

这是因为您每次都使用以下命令重新打开文件:

PrintWriter pw = new PrintWriter(new FileWriter(myFile));

执行此操作时,现有文件将被截断,新数据将替换它(默认情况下,FileWriter以这种方式打开文件)。最简单的选择可能是FileWriter open the file in append mode

PrintWriter pw = new PrintWriter(new FileWriter(myFile, true));

另一种方法是在您编写所有记录之前打开文件一次,并将PrintWriter(或FileWriter)传递给generateCSV而不是File:< / p>

public static void generateCSV(PrintWriter pw, double[][] ProtonTracking,int n) throws IOException{
    pw.print(String.format("Trial Number :, %d\n",  n));
    for(int i= 0; i < Array.getLength(ProtonTracking); i++) {
        pw.print(String.format("%f, %f%n", ProtonTracking[i][0], ProtonTracking[i][1]));
    }
    pw.flush();
    // <- note that .close() was removed! don't close until completely done.
}

选择最适合您应用的选项。


在评论中你问:

  

然而,这些都是在两列中一个接一个地垂直包含的。是否可以在许多两列部分中并排显示这些?

使用您当前的结构,不容易。将插入数据放入文件中间通常是非常重要的。您可以想象创建一个方法来加载现有文件的行,将数据附加到每一行,然后将所有行写回(性能最终会受到很大影响)。但是,更清洁的方法将是以下三种选择之一:

  1. 提前收集要写入文件的所有数据。甚至可能创建一个小的Trial类来保存有关单个试验的信息(这也将为您的代码提供更清晰的语义含义,这有助于消除长期的混淆和错误)。然后,当需要编写整个文件时,您可以根据需要自由迭代您的试验集合,并按照您希望的任何顺序写出数据。

  2. 在此重新定义您的概念。修改代码以在行中存储给定试用版的所有对(您甚至可以将n本身存储在第一列中,以及其他有趣的信息,例如记录的时间戳,在其他栏目中)。 CSV文件以表格格式存储数据。通常,在表中,每行都是一条记录,每列都是一个字段。我只是猜测,但在你的应用程序中,似乎是一个&#34;试验&#34;是某种独立的记录,每个试验都有一组与之相关的属性(字段)。考虑到这一点,实际上非常适合使用一个非常宽的表格,每个试验作为一行,每个试验的每个数据作为一列。这就是为什么,例如,电子表格软件中的图形生成器默认将作为数据字段。

  3. 表的第一行通常是为标题保留的。您存储&#34;试用x&#34;是不寻常的。整个表格中间隔的标题。考虑到这一点,也许您应该为每个试验考虑一个单独的CSV文件。根据{{​​1}}生成文件名。

  4. 选项2和3可能并不总是合适的;例如,您可能会受到某些希望数据采用特定格式的第三方应用程序的约束。但是,如果您具有灵活性,它听起来像一个宽表,每次试用一行,或每次试用单独的文件,是一种更自然的数据表示(当然,也更容易编写)。如果您使用CSV的目标只是在电子表格程序中随意格式化输出以便于人类查看(而不是数据存储/分析),您可能也找不到适合的选项。

    选项1,如果这是您的方式,要求您提前提供所有数据(根据您的应用程序的性质,可能会或可能不会,内存要求等),这样你就可以&#34;交错&#34;你在每一排输出中的试验。