Java Streams -> Извлечение значения по определенному индексу из списка - PullRequest
0 голосов
/ 26 августа 2018

Я читаю файл CSV с потоками Java 8 и как лучше всего получить значение определенного столбца в файле CSV Например,

firstName,lastName,age,
tom,abraham,18,
liz,abraham,15,
tonny,paul,25

Я хочу извлечь второй столбец, поэтому набор результатов будет abraham;paul Как это можно сделать с помощью Java 8 лямбда и Streams?

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Вы можете использовать поток карты.

Files.lines(Paths.get("file path")).map(row -> row.split(";")).map(row -> row[1]).distinct().collect(Collectors.toList());

//first map: transform string to Array.
//Second map: choose first index array.
//distinct: remove duplicates elements.
0 голосов
/ 26 августа 2018

Добро пожаловать в StackOverflow :)

Файл CSV может быть прочитан как любой другой текстовый файл, анализатор не требуется, а String::split с File::readAllLines достаточно:

Set<String> names = Files.readAllLines(Paths.get("file.csv")) // Read all lines of file
                         .stream()                            // Stream them
                         .skip(1)                             // Omit the column names (if any)
                         .map(s -> s.split(";")[1])           // Split by ; and get the 2nd column
                         .collect(Collectors.toSet());        // Collect Strings to Set

Я плохо читал этикетку.Если вы уже проанализировали List<List<String>>, самый простой способ достижения того же результата:

Set<String> names = parsedList.stream()
                              .map(row -> row.get(1))       // Get the second column
                              .collect(Collectors.toSet())  // collect to Set<String>

Обратите внимание на следующее:

  • Не требуетсяМетод distinct() с момента сбора до Set обеспечивает определение отдельных элементов по определению.Если вы настаиваете на сборе до List<String>, замените последнюю строку на:

     ....
     .distinct()
     .collect(Collectors.toList());
    

    Этот способ действителен для обоих предложенных мной решений.

  • Исключениеможет появиться в следующих строках в случае неправильной структуры CSV или экранированных символов ;:

    • map(s -> s.split(";")[1])
    • map(list -> list.get(1))

    Тогдавам нужно использовать парсер.

0 голосов
/ 26 августа 2018
Files.readAllLines(Paths.get("my.csv")).stream()
        .skip(1)
        .map(s -> s.split(";")[1])
        .distinct()
        .collect(Collectors.toList()).forEach(System.out::println);

Это самый простой способ, но я бы предпочел использовать регулярное выражение и Matcher для этого случая.

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