BufferedReader возвращает столбцы вместо строки - PullRequest
1 голос
/ 21 февраля 2020

Когда я делаю это ...

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]?

Когда я сделал ...

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), я получаю строки, как и ожидалось, так почему не первым методом?

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

В CSV-файле каждая строка является строкой. Разделение линий - вот что дает вам столбцы. Поэтому, если вы хотите строки, вам не нужно разбивать строки, просто распечатайте их, как они есть. Например, чтобы распечатать только первый ряд, все, что вам нужно сделать, это

try (BufferedReader bufferedReader = new BufferedReader(new FileReader(filename))) {
    String firstRow = bufferedReader.readLine();
    System.out.println(firstRow);
} catch (IOException e) {
    e.printStackTrace();
}
1 голос
/ 21 февраля 2020

В первом примере вы читаете каждую строку с bufferedReader.readLine(), что уже дает вам строку. Затем вы разделяете строку на символ ,, который дает вам столбцы для текущей строки.

Ваш пример секунд с использованием bufferedReader.lines() возвращает поток строк, который вы собираете с помощью .collect(Collectors.toList()). Каждая из этих строк в вашем списке все еще содержит строку со всеми запятыми. Так что вам, вероятно, понадобится 2D-массив или 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();
}
1 голос
/ 21 февраля 2020
while ((line = bufferedReader.readLine()) != null) {
  String[] data = line.split(",");
}

Здесь вы выбираете одну строку, разделяете ее на части по , и присваиваете переменную data. В то время вы обрабатываете одну строку, и нет возможности ссылаться на строку x, поскольку вы получили только одну строку. И эта переменная определена внутри while l oop, поэтому ее состояние доступно только в течение одной данной итерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...