如何读取包含x行数和y列数的.csv excel文件,忽略不相关的单元格(如名称之类的东西),然后计算每列中数字的平均值?
我拥有的Excel是这样的(表示新单元格):
ID, week 1, week 2, week 3, .... , week 7
0 , 1 , 0.5 , 0 , , 1.2
1 , 0.5 , 1 , 0.5 , , 0.5
y , ......
所以,我该怎么做才能读取那种.csv文件然后计算所有星期的第1周=(第1周平均值),第2周=(第2周平均值)格式的平均值?
我还假设我需要使用2D数据吗?
编辑 到目前为止,这是我的代码,它非常粗糙,我不确定它是否能正常运行:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ClassAverage {
public static void main(String[] args){
readFile2Array("attendance.csv");
}
public static double[][] readFile2Array(String fileName){
try {
int rowCount = 0;
int colCount = 0;
Scanner rc = new Scanner(new File("attendance.csv"));
while (rc.hasNextLine()) {
rowCount++;
rc.nextLine();
}
rc.close();
System.out.println(rowCount);
Scanner cc = new Scanner(new File("attendance.csv"));
while (cc.hasNext()) {
colCount++;
cc.next();
}
cc.close();
colCount = colCount/rowCount;
System.out.println(colCount);
Scanner sc = new Scanner(new File("attendance.csv"));
double[][] spreadSheet = new double[rowCount][colCount];
while (sc.hasNext()) {
for (int i=0; i<spreadSheet.length; ++i){
for (int j=0; j<spreadSheet[i].length; ++j){
spreadSheet[i][j] = Double.parseDouble(sc.next());
}
}
}
sc.close();
return spreadSheet;
} catch (FileNotFoundException e) {
System.out.println("File cannot be opened");
e.printStackTrace();
}
return null;
}
public static double weeklyAvg(double[][] a){
}
}
总结一下它打算做什么
readFile2Array:读取csv文件并计算行数,然后计算单元格总数,按行数除以单元格总数以查找列数。再次读取并将每个单元格放入2D数组中的正确位置。
weeklyAvg:我还没有想过要做到这一点的方法,但它应该逐列读取数组并计算每列的平均值,然后打印出结果。
PS。我是Java的新手,所以我不知道一些建议是什么意思,所以我真的很感谢那些没有插件和东西的基于纯Java的建议(我不确定这是否是某些人所建议的)。我希望不要求太多(如果可能的话)。
答案 0 :(得分:0)
您可以使用Java库来处理CSV文件。例如opencsv(你可以在这里找到最新的maven版本http://mvnrepository.com/artifact/com.opencsv/opencsv/3.5)
然后您可以像这样解析文件:
CSVReader reader = new CSVReader(new FileReader("PATH_TO_YOUR_FILE"));
String[] nextLine;
int counter = 0;
while ((nextLine = reader.readNext()) != null) {
// nextLine[] is an array of values from the line
System.out.println(nextLine[0] + nextLine[1]);
}
您必须忽略标题行,您可以通过递增计数器并跳过零值来执行此操作。 要计算平均值,您可以使用哈希映射,其中键是列标题名称(示例第1周)。然后用当前行值递增,在循环完成后,除以行数(不要忘记减去忽略的行,如标题行)
答案 1 :(得分:0)
要解析简单的CSV文件,只需手动解析它就可以非常简单,只要您知道整个文件中的格式相同且不包含错误
LinkedList<String>
)BufferedReader
String.split(',')
并将返回数组中的特定列添加到正确的LinkedList Double.parseDouble()
将字符串转换为双精度数)要确保您尝试解析的字符串是double,您可以使用try-catch语句或使用正则表达式。查看Java: how to check that a string is parsable to a double?了解详情