java - 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]
有什么建议么?谢谢!
解决方案
您已经创建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]);
}
}
推荐阅读
- scala - 来自 Calendar.getInstance.getTimeInMillis 的额外毫秒数
- java - 如何解决 Dr Java 中的“无法在类路径或引导类路径中找到包 java.lang”?
- excel - .Body 不会编译,但引号和换行括号似乎是正确的
- objective-c - NSMutableDictionary 和 mutableCopy
- apache-spark - Hadoop 3 和 spark.sql:同时使用 HiveWarehouseSession 和 spark.sql
- r - r 序列问题 - 给定序列中的最大更改数
- c++ - 根据运行时提供的类型执行模板函数
- qbasic - 使用 repl.it 在 QuickBasic 中编程?
- excel - 如何在 Excel VBA 中发送和返回范围/数组
- jenkins - Jenkins Scripted Pipeline 将工件保留 90 天,或 10 次构建价值,以更大的为准