我正在尝试将两列数组写入.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(", ,");
}
但这会覆盖所有以前的列。
答案 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.
}
选择最适合您应用的选项。
在评论中你问:
然而,这些都是在两列中一个接一个地垂直包含的。是否可以在许多两列部分中并排显示这些?
使用您当前的结构,不容易。将插入数据放入文件中间通常是非常重要的。您可以想象创建一个方法来加载现有文件的行,将数据附加到每一行,然后将所有行写回(性能最终会受到很大影响)。但是,更清洁的方法将是以下三种选择之一:
提前收集要写入文件的所有数据。甚至可能创建一个小的Trial
类来保存有关单个试验的信息(这也将为您的代码提供更清晰的语义含义,这有助于消除长期的混淆和错误)。然后,当需要编写整个文件时,您可以根据需要自由迭代您的试验集合,并按照您希望的任何顺序写出数据。
在此重新定义您的概念。修改代码以在单行中存储给定试用版的所有对(您甚至可以将n
本身存储在第一列中,以及其他有趣的信息,例如记录的时间戳,在其他栏目中)。 CSV文件以表格格式存储数据。通常,在表中,每行都是一条记录,每列都是一个字段。我只是猜测,但在你的应用程序中,似乎是一个&#34;试验&#34;是某种独立的记录,每个试验都有一组与之相关的属性(字段)。考虑到这一点,实际上非常适合使用一个非常宽的表格,每个试验作为一行,每个试验的每个数据作为一列。这就是为什么,例如,电子表格软件中的图形生成器默认将列作为数据字段。
表的第一行通常是为标题保留的。您存储&#34;试用x&#34;是不寻常的。整个表格中间隔的标题。考虑到这一点,也许您应该为每个试验考虑一个单独的CSV文件。根据{{1}}生成文件名。
选项2和3可能并不总是合适的;例如,您可能会受到某些希望数据采用特定格式的第三方应用程序的约束。但是,如果您具有灵活性,它听起来像一个宽表,每次试用一行,或每次试用单独的文件,是一种更自然的数据表示(当然,也更容易编写)。如果您使用CSV的目标只是在电子表格程序中随意格式化输出以便于人类查看(而不是数据存储/分析),您可能也找不到适合的选项。
选项1,如果这是您的方式,将要求您提前提供所有数据(根据您的应用程序的性质,可能会或可能不会,内存要求等),这样你就可以&#34;交错&#34;你在每一排输出中的试验。