Как использовать Collectors.groupingBy в потоке Java без методов класса POJO - PullRequest
0 голосов
/ 07 февраля 2019

Я читаю один CSV-файл (размер составляет приблизительно 700 МБ с 103415834 строками) и пытаюсь получить все строки, имеющие определенные значения.Я могу получить строку, если в ней всего 1 запись, но нет, если в ней более 1 записи.Ниже приведен мой код, который отлично работает для 1 записи.

    try (Stream<String> stream = Files.lines(Paths.get(IN_FILE_PATH))) {

        int nameIndex = columns.indexOf("Rate");

        Stream<String> stream1 = Files.lines(Paths.get(IN_FILE_PATH));

        List<List<String>> values = stream1
                .skip(1)
                .map((line) -> Arrays.asList(line.split(",")))
                .filter(list -> list.get(nameIndex).equals("25"))
                .collect(Collectors.toList());

        System.out.println(values.size());
        values.forEach((l) -> System.out.println(l));

    } catch (IOException e1) {
        e1.printStackTrace();
    }

И пример строки для файла CSV, пытающегося выполнить синтаксический анализ, приведен ниже:

MD,URN,PremiseType,Rate,OHP 09022,null,Residential,14,null 38329,1428275,Residential,14,null 38742,563459,Single,21,111

1 Ответ

0 голосов
/ 08 февраля 2019

Здесь группируется по Rate (arr [3]), но вы можете группировать по любому полю, которое вы хотите:

Map<String, List<String>> map = Files.lines(Paths.get(IN_FILE_PATH))
            .skip(1)
            .map(line -> line.split(","))
            .collect(groupingBy(arr -> arr[3], 
                     mapping(strings -> String.join(" ", strings), toList())));

Ключ из результата map - это поле, по которому вы группируете (в этомcase Rate), значение (List<String>) представляет собой список строк с одинаковой скоростью.

Надеюсь, это помогло

...