我刚刚开始学习java,我有一个小项目试图通过它学习java。 该项目的一个方面是打开数据文件(逐个),读取每列中的元素,并将这些元素从每个文件中加起来。
为了解释一下,假设我想将第一个文件中的第一个元素添加到第二个文件中的第一个元素,依此类推,直到最后一个文件。 我有4个csv文件,每个文件有24列,每列有1000个元素。
如果我的问题听起来很愚蠢,请接受我的道歉,但我已经尝试这样做超过三天:'(
我希望你的一位专家可以帮我解决这个障碍!
这是我创建的代码的一部分,但是这段代码的问题是它读取每个文件的整个列,而我只想读取每个文件的元素。原因是因为我想稍后进行一些数据操作,比如取平均值或标准偏差(这些分离的元素):
//================================= Generate XY-data for calculations
static double[][][] node_Data(String filename, int colmn) throws IOException{
// I skipped here the stuff which you don't need, not relevant.
node_data = new double [numberOfFiles][colmnLenght][numberOfColmns];
try {
scan = new Scanner (new BufferedReader(new FileReader(filename)));
scan.nextLine();
colmn_entries = 0;
for (int experiment = firstFile_index; experiment < lastFile_index; experiment++ ){
while (scan.hasNext()){
scanedData = scan.nextLine();
String [] array=scanedData.split(",");
node_data[experiment][colmn_entries][colmn] = Double.parseDouble(array[colmn]);
//System.out.println(node_data[experiment][colmn_entries][colmn]);
colmn_entries++;
}
}
} catch (FileNotFoundException e) { e.printStackTrace(); }
return node_data;
}
//-------------------------------------- End of XY-generator
然后我用main()函数中的列数循环上面的函数,该函数加载文件名(基本上获取该路径及其索引)
输入文件应如下所示: file(1):
A, B, C, D, E, F, ...
1, 2, 3, 4, 5, 6, ...
1, 2, 3, 4, 5, 6, ...
1, 2, 3, 4, 5, 6, ...
1, 2, 3, 4, 5, 6, ...
file (2):
A, B, C, D, E, F, ...
7, 8, 9, 10, 11, 12, ...
7, 8, 9, 10, 11, 12, ...
7, 8, 9, 10, 11, 12, ...
7, 8, 9, 10, 11, 12, ...
等等,直到文件n。输出应该存储在某个地方(数组或列表或任何可以处理的内容),并按如下方式读取:
1, 2, 3, 4, 5, 6, ... (coming from file [1])
7, 8, 9, 10, 11, 12, ... (coming from file [2])
13, 14, 15, 16, 17, 18, ... (coming from file [3])
....
....
最终,应该能够单独计算每个文件的所有元素的均值,例如通过简单地对生成的存储输出数组中的第一个(或任何)列求和。
答案 0 :(得分:0)
使用此代码,您应该能够阅读第一项并总结为4个不同CSV文件的sumALLCSV
变量。
import java.io.BufferedReader;
import java.io.FileReader;
public class ReadCSV {
public static int sumALLCSV=0;
String [] arrayCSVnames = ["test.csv", "test2.csv", "test3.csv", "test4.csv"];
public static void main(String[] args) throws Exception {
String splitBy = ","; // could be ";"
for (int i = 0, i<arrayCSVnames.length, i++) {
BufferedReader br = new BufferedReader(new FileReader(arrayCSVnames[i]));
String line = br.readLine();
String[] b = line.split(splitBy);
//b here is your first element from your CSV.
System.out.println(b[0]);
// adding to the variable (below)
sumALLCSV += Integer.parseInt(b[0]);
br.close();
}
}
}
答案 1 :(得分:0)
好的,我设法修复了我的代码,这就是我修复它的方法,也许它会帮助别人。
while
循环实际上导致了所有麻烦,我不得不用for
循环替换它
package your_package_goes_here;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.Scanner;
public class data_vault { // start of the class "{"
///private static int elementSize;
static double[][][] data;
static int data_size;
static void data_generator(int firstFile, int lastFile, int firstColmn, int lastColmn) throws NumberFormatException, IOException{
for (int colmn = firstColm; colmn < lastColmn; colmn++ ){
//System.out.println("------ column: " + colmn); // just to follow up with the ordering, not needed at all.
for (int index = firstFile; index < lastFile; index++){
fetch_data(index, colmn);
data_manipulate.data_mean(index, colmn);
// You can basically do whatever you want with this data now,
//here I'm just taking the mean as a simple example (implemented in a different class "data_manipulate")
}
}
}
以下函数从每个文件中收集数据并将其存储在3D数组double [][][] data
中。请注意,此处的文件标记为int index
,如下所述file_call()
函数。
//================================= Generate data for calculations
public static double[][][] fetch_data(int index, int node) throws IOException{
//for (int index = start; index < end; index++){
int length = file_length(index);
data = new double [number_of_files][length_of_file][number_of_columns]; // This should be the size of your 3d array.
for (int i = 0; i < length; i++){
Scanner scan = new Scanner (new BufferedReader(new FileReader(file_call(index))));
scan.nextLine();
if (scan.hasNext()){
String scanedData = scan.nextLine();
String [] array = scanedData.split(",");
data[index][i][node] = Double.parseDouble(array[node]);
//System.out.println("node: " + node + ", entry: " + data[index][i][node]);
//System.out.println("entry: " + data[index][i][node]);
}
}
//System.out.print("file: " + file_call(index));
//}
return data;
}
//-------------------------------------------------------
因为在我的项目中文件被索引,所以它们的名字出现在下面的路径中,我不得不创建这个函数,以后可以在主循环中调用并运行文件索引:
../path/to/file/data_file_parameter_setting_1.csv
../path/to/file/data_file_parameter_setting_2.csv
...
../path/to/file/data_file_parameter_setting_n.csv
这就是我所谓的file_call(int index)
,对不起,如果我为我的职能选择尴尬的名字。
//================================= Call the loaded data file and issue it a name
public static String file_call(int index) throws IOException{
String name = Analytics.exprName.getText();
String parameter = String.valueOf(Analytics.paramType_1.getSelectedItem());
String setting = String.valueOf(Analytics.typeSet);
String filename = reading_data.locate_file(name, parameter, setting, index);
//System.out.println("File: " + filename); // just following up here too, no need to print.
return filename;
}
下面的这个函数只会确定文件的长度,原则上是每列的长度。我需要确定这样的参数,以便我可以迭代所有条目。
//================================= Determine file length
public static int file_length(int index) throws IOException{
LineNumberReader lnr = new LineNumberReader(new FileReader(new File(file_call(index))));
try {
lnr.skip(Long.MAX_VALUE);
}
catch (IOException e1) {
e1.printStackTrace();
}
lnr.close();
data_size = lnr.getLineNumber()-1;
//System.out.println(elementSize);
return data_size;
}
//-------------------------------------------------------
} // end of the class "}"
我希望有人会发现这个解决方案很有用,如果你愿意,可以大拇指;) 也感谢那些在我的帖子中发表评论的人,感谢。