Java 从.csv excel文件读取并计算平均值

Java 从.csv excel文件读取并计算平均值,java,arrays,csv,Java,Arrays,Csv,如何读取具有x行数和y列数的.csv excel文件,忽略不相关的单元格(如名称),然后计算每列中的数字平均值 我的Excel是这样的(,表示新单元格): 那么,如何使它读取那种.csv文件,然后以第1周=(第1周平均值),第2周=(第2周平均值)的格式计算所有周的平均值 我是否正确地假设我需要使用一个2D数组来实现这一点 编辑 这是我到目前为止的代码,它非常粗糙,我不确定它是否能正常工作: import java.io.File; import java.io.FileNotFoundExce

如何读取具有x行数和y列数的.csv excel文件,忽略不相关的单元格(如名称),然后计算每列中的数字平均值

我的Excel是这样的(,表示新单元格):

那么,如何使它读取那种.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){

    }
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公共班级平均成绩{
公共静态void main(字符串[]args){
readFile2Array(“Attention.csv”);
}
公共静态双[][]readFile2Array(字符串文件名){
试一试{
int rowCount=0;
int colCount=0;
扫描器rc=新扫描器(新文件(“Attention.csv”);
while(rc.hasNextLine()){
行计数++;
rc.nextLine();
}
rc.close();
System.out.println(行计数);
扫描仪cc=新扫描仪(新文件(“Attention.csv”);
而(cc.hasNext()){
colCount++;
cc.next();
}
cc.close();
colCount=colCount/rowCount;
System.out.println(colCount);
Scanner sc=新扫描仪(新文件(“Attention.csv”);
double[][]电子表格=新的double[rowCount][colCount];
while(sc.hasNext()){

对于(inti=0;i您可以使用Java库来处理CSV文件。例如opencsv(您可以在这里找到最新的maven版本)

然后你可以像这样解析你的文件:

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]);
    }
您必须忽略标题行,只需增加计数器并跳过零值即可。
要计算平均值,可以使用一个hashmap,其中键是列标题名(示例1周)。然后用当前行值递增,循环完成后除以行数(不要忘了减去被忽略的行,如标题行)

要解析简单的CSV文件,只要您知道整个文件的格式都是相同的,并且不包含错误,手动解析就非常简单了

  • 为要计算的每个列创建存储数据结构(使用
    LinkedList
  • 使用
    BufferedReader
  • 在每一行上使用
    String.split(',')
    ,并将返回数组中的特定列添加到正确的LinkedList中
  • 循环遍历最后的LinkedList并计算平均值(使用
    Double.parseDouble()
    将字符串转换为双精度)

  • 要确保您试图解析的字符串是双精度字符串,您可以使用try-catch语句或regex。检查更多信息

    到目前为止您是否尝试过任何操作?请分享您的成果。二维数组是一种实现这一点的方法,但您也可以使用一维数组。如果你有一些相关的代码要处理-请告诉我们你到目前为止都做了些什么你正在努力解决的部分是什么?我正在努力将一个.csv文件读入一个二维数组,并逐列读取所述数组(同时忽略不相关的内容,如列名或行名)要检查您的值是否为double,只需使用double.parseDouble静态方法并捕获NumberFormatException。更优雅的方法是为可接受的值定义一个正则表达式有没有一种不用CSVReader的方法?我不知道maven是什么:\
    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]);
        }