为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中的csv文件中对行进行分组

在Java中的csv文件中对行进行分组

慕森王 2021-05-04 17:54:34
我是Java的新手,我必须解析一个.csv文件。该文件在每一行中包含学生的ID,他们通过的科目ID和他们通过的科目成绩。例如:Student ID,Subject ID,Grade1,A1-102,71,A1-103,61,A1-104,51,A1-108,92,A1-101,52,A1-105,7我需要计算一个学生通过的类似于SQL's GROUP BYEg的课程的数量:SELECT count(*) FROM STUDENTS GROUP BY Student_ID;假设csv文件已打开并可以读取,是否可以为一个学生对多个条目进行分组?我的代码:csvFile = "C:\\Myfile.csv";             try {            br = new BufferedReader(new FileReader(csvFile));            while ((line = br.readLine()) != null) {              // what do i need to do here?            }        } catch (FileNotFoundException e) {            System.out.println("File not found\n");        } catch (IOException e) {            System.out.println("An I/O exception has occured\n");        } finally {                if (br != null)                try {                    br.close();                } catch (IOException e) {                    System.out.println("File is already closed");                }            }有什么想法吗?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

对于数据组织而言,拥有一个arraylist并不是最佳的解决方案。我附加了最后一个解决方案,以引入一个哈希表,该哈希表存储由学生ID标识的数组列表。有些事情是一样的,例如for循环需要确切的学生人数。


BufferedReader br = null;

    //this is the master HashMap, a datastructure which points to n amount of separate arraylist objects.

    HashMap<String, ArrayList<String>> master = new HashMap<>();


    //x = 3 for demonstration purposes replace the value with the 

    //actual number of students 

    for(int x = 1; x <= 3; x++) {


        try {

            String line;

            ArrayList<String> result = new ArrayList<>();


            br = new BufferedReader(new FileReader(csvFile.toString()));

            String StudentIDNeeded = Integer.toString(x);


            while ((line = br.readLine()) != null) {


                if (line.substring(0, 1).equals(StudentIDNeeded)) {

                    result.add(line.substring(2).toString());

                }

            }


            master.put(Integer.toString(x),result);


        } catch (FileNotFoundException e) {

            System.out.println("File not found\n");

        } catch (IOException e) {

            System.out.println("An I/O exception has occured\n");

        } finally {

            if (br != null)

                try {

                    br.close();

                } catch (IOException e) {

                    System.out.println("File is already closed");

                }

        }


    }


    System.out.println("Hash Size:"+master.size());

    System.out.println("Hash Contents" + master.toString());

}

此代码块输出这两个字符串


Hash Size:3

Hash Contents{1=[A1-102,7, A1-103,6, A1-104,5, A1-108,9], 2=[A1-101,5], 

3=[A1-105,7, A1-101,5]}

该解决方案应该通过利用哈希图中的许多数组列表来扩展到更大的数据集。


查看完整回答
反对 回复 2021-05-19
  • 3 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信