首页 > 解决方案 > Java 读取 CSV 文件的行并将其存储到列表列表中

问题描述

我有一个 CSV 文件,如下所示:

First, Surname, Age    
Jim, Halpert, 35
Dwight, Schrute, 38

我需要按列存储它(名字列表、姓氏列表、年龄列表)。我创建了一个列表来存储这个表示。

List<List<String>> myList = new ArrayList<List<String>>();
        while ((row = csvReader.readLine()) != null)
        {
            String[] myRow = row.split(",");
            for (int j=0; j<COLUMN_COUNT; j++)
            {
                myList.get(j).add(i,myRow[j]);
                System.out.println(data.get(j).get(i));

            }
            i++;
        }

我的问题是,既然我知道 COLUMN_COUNT 是什么,为什么这不起作用?我只是想遍历每一行,在每一行中,我将 CSV 分隔为一个数组,然后将其存储在基于列的列表列表中。

我得到的实际错误是:

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0

并且错误发生在线myList.get(j)...

谢谢

编辑

你们中的一些人建议了我现在正在使用的工作示例,非常感谢您!现在,我在想我可能会使用 Java Streams,所以它需要更少的代码并得到更多的优化。但是,当我这样做时:

List<List<String>> myList = Files.lines(Path.of(csvPath)) // Stream<String>
                    //  .skip(1) // (optional) skip a header line
                    .map(line -> Arrays.stream(line.split("\\s*,\\s*")) // split by comma and trim whitespaces
                            .collect(Collectors.toList()) // get list of columns
                    ) // Stream<List<String>>
                    .collect(Collectors.toList());

结果我只得到这样的东西:

[Jim, Halpert, 35]
[Dwigth, Schrute, 38]

但我实际上需要

[Jim, Dwight]
[Helpert, Schrute]
[35,38]

有什么建议么?谢谢!

标签: javaarrayslistcsvsplit

解决方案


您已经创建myList但它是空的,它不包含处理每列值的列表,您需要预先填充它

// Add a list for each column
for (int j = 0; j < COLUMN_COUNT; j++) {
    myList.add(new ArrayList<>());
}

然后您可以添加日期,并且您不需要i在子列表中设置值,只需将其附加在其他值之后

while ((row = csvReader.readLine()) != null) {
    String[] myRow = row.split(",");
    for (int j = 0; j < COLUMN_COUNT; j++) {
        myList.get(j).add(myRow[j]);
    }
}

推荐阅读