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();
}
当我这样做时...
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();
}