BufferedReader 返回列而不是行

BufferedReader returning columns instead of row

当我这样做时...

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filename))) {
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        String[] data = line.split(",");
    }
} catch (IOException e) {
    e.printStackTrace();
}

如果我打印 data[0],我得到的是第一列而不是第一行。当我做 data[0] 时如何将其修改为 return 行?

当我做的时候...

List<String> data;

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filename))) {
    data = bufferedReader.lines().collect(Collectors.toList());
} catch (IOException e) {
    e.printStackTrace();
}

然后 data.get(0),我得到了预期的行,为什么不使用第一种方法呢?

while ((line = bufferedReader.readLine()) != null) {
  String[] data = line.split(",");
}

在这里,您将获取一行,将其按 , 拆分为多个部分,然后分配给 data 变量。那时你只处理了一行,没有办法引用第 x 行,因为你只有一行。并且该变量是在 while 循环内部定义的,因此它的状态只能在给定的一次迭代中访问。

在 CSV 文件中,每个 是一行。分割线就是为您提供列的原因。因此,如果您想要这些行,则无需拆分行,只需按原样打印出来即可。例如只打印第一行,你需要做的就是

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filename))) {
    String firstRow = bufferedReader.readLine();
    System.out.println(firstRow);
} catch (IOException e) {
    e.printStackTrace();
}

在您的第一个示例中,您使用 bufferedReader.readLine() 读取每一行,这已经为您提供了一行。然后在 , 字符处拆分行,这会为您提供当前行的列。

您的秒示例,使用 bufferedReader.lines() returns 行流,您使用 .collect(Collectors.toList()) 收集。 List 中的每一行仍然只有一个包含所有逗号的字符串。所以你可能想要的是二维数组或 List<List<String>>.

您可以通过以下方式实现:

try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
    final List<List<String>> table = br.lines()
            .map(row -> Stream.of(row.split(","))
                    .collect(Collectors.toList()))
            .collect(Collectors.toList());

    System.out.println(table.get(0));
} catch (IOException e) {
    e.printStackTrace();
}