【问题标题】:Read from .csv excel file and compute average从 .csv excel 文件中读取并计算平均值
【发布时间】:2015-11-06 14:33:50
【问题描述】:

如何读取 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 周平均值)格式计算所有周的平均值?

我是否也正确地假设我需要为此使用二维数组?

编辑 到目前为止,这是我的代码,它非常粗糙,我不确定它是否能正常工作:

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文件并计算行数,然后计算单元格总数,将单元格总数除以行数得到列数。再次读取并将每个单元格放入二维数组中的正确位置。

weeklyAvg:我还没有想出办法来做到这一点,但它应该逐列读取数组并计算每列的平均值,然后打印出结果。

PS。我是 Java 的新手,所以我不知道一些建议是什么意思,所以我非常感谢那些没有插件和东西的纯 Java 的建议(我不确定这是否是某些人的建议)。我希望要求不要太多(如果可能的话)。

【问题讨论】:

  • 到目前为止你有没有尝试过?请分享你的努力。
  • 二维数组是执行此操作的一种方式,但您也可以使用一维数组来执行此操作。
  • 如果人们有一些相关的代码要处理,他们会更容易帮助您 - 请向我们展示您迄今为止所做的尝试
  • 你正在苦苦挣扎的部分是什么?
  • 我正在努力将 .csv 文件读取到二维数组,并逐列读取所述数组(同时忽略不相关的内容,如列名或行名)

标签: java arrays csv


【解决方案1】:

您可以使用 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 周)。然后用当前行值递增,循环完成后除以行数(不要忘记减去被忽略的行,如标题行)

【讨论】:

  • 要检查您的值是否为双精度值,您只需使用 Double.parseDouble 静态方法并捕获 NumberFormatException。一种更优雅的方法是为可接受的值定义一个正则表达式
  • 有没有办法在没有 CSVReader 的情况下做到这一点?我不知道 maven 是什么:\
【解决方案2】:

要解析简单的 CSV 文件,只需手动解析即可,只要您知道整个文件的格式相同且不包含错误即可

  1. 为您希望计算的每一列创建一个存储数据结构(使用LinkedList&lt;String&gt;
  2. 使用BufferedReader逐行读取CSV文件
  3. 在每一行上使用String.split(','),并将返回数组中的特定列添加到正确的LinkedList中
  4. 循环遍历最后的 LinkedList 并计算平均值(使用 Double.parseDouble() 将字符串转换为双精度)

要确保您尝试解析的字符串是双精度字符串,您可以使用 try-catch 语句或使用正则表达式。查看Java: how to check that a string is parsable to a double?了解更多信息

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2020-07-11
    • 2015-01-08
    • 2014-02-08
    相关资源
    最近更新 更多