通过一次迭代从列表中读取多行



读取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);
}
}

我确实认为应该有一个"更清洁"的解决方案。

当你说";"清洁剂";,但这里有一些建议,我认为可以改进你的代码:

  1. 考虑根据需要读取CSV行,而不是先将它们全部读入内存,然后返回并迭代。如果您使用的是OpenCSV的CsvReader,那么这意味着使用readNext()方法而不是readAll()方法。目前尚不清楚是否或如何对您实际使用的未指定CsvReader进行同样的处理。

  2. 使用表示迭代的当前状态的对象,而不是按索引进行迭代。如果您坚持将所有行收集到List中,那么这意味着使用列表的Iterator来获得单独的行。如果您实现上面的建议(1(,那么CsvReader本身将是所需的对象。

  3. 在(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);
}
}

相关内容

  • 没有找到相关文章

最新更新