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

时间:2015-11-06 14:33:51

标签: java arrays csv

如何读取包含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的建议(我不确定这是否是某些人所建议的)。我希望不要求太多(如果可能的话)。

2 个答案:

答案 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文件,只需手动解析它就可以非常简单,只要您知道整个文件中的格式相同且不包含错误

  1. 为您要计算的每列创建存储数据结构(使用LinkedList<String>
  2. 使用BufferedReader
  3. 逐行阅读CSV文件
  4. 在每一行上使用String.split(',')并将返回数组中的特定列添加到正确的LinkedList
  5. 在最后遍历LinkedLists并计算平均值(使用Double.parseDouble()将字符串转换为双精度数)
  6. 要确保您尝试解析的字符串是double,您可以使用try-catch语句或使用正则表达式。查看Java: how to check that a string is parsable to a double?了解详情