读取CSV文件时,我想记住/存储该特定文件的多行数据,例如,根据第1+2行、第3+4行等的列创建对象。
虽然我已经找到了解决方案,但我确实认为应该有一个"更清洁"的解决方案。这就是我想到的:
public static void main(String[] args) {
try (var reader = new FileReader("src/main/java/com/kdh/snippets/loops/dummy.csv")) {
List<String[]> rows = CsvReader.read(reader);
var index1 = 0;
var index2 = 1;
// 50 lines in file = 25 iterations
for (int i = 0; i < rows.size() / 2; i++) {
String[] consumption = rows.get(index1);
String[] injection = rows.get(index2);
System.out.println("Consumption: " + consumption[8] + ", Injection: " + injection[8]);
index1 += 2;
index2 += 2;
}
} catch (IOException ex) {
System.out.println(ex);
}
}
我确实认为应该有一个"更清洁"的解决方案。
当你说";"清洁剂";,但这里有一些建议,我认为可以改进你的代码:
-
考虑根据需要读取CSV行,而不是先将它们全部读入内存,然后返回并迭代。如果您使用的是OpenCSV的
CsvReader
,那么这意味着使用readNext()
方法而不是readAll()
方法。目前尚不清楚是否或如何对您实际使用的未指定CsvReader
进行同样的处理。 -
使用表示迭代的当前状态的对象,而不是按索引进行迭代。如果您坚持将所有行收集到
List
中,那么这意味着使用列表的Iterator
来获得单独的行。如果您实现上面的建议(1(,那么CsvReader
本身将是所需的对象。 -
在(2(到位的情况下,简单地循环,直到线源没有更多(对(线可供提供。
例如,
public static void main(String[] args) {
try (var reader = new CsvReader(
new FileReader("src/main/java/com/kdh/snippets/loops/dummy.csv"))) {
for (String[] line = reader.nextLine(); line != null; line = reader.nextLine()) {
String consumption = line[8];
line = reader.nextLine();
if (line == null) {
// warn about an odd number of lines?
break;
}
String injection = line[8];
System.out.println("Consumption: " + consumption + ", Injection: " + injection);
}
} catch (IOException ex) {
System.out.println(ex);
}
}