Потоки Java и многострочные записи - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь использовать потоки Java для чтения текстового файла с многострочными записями

У меня есть текстовый файл, состоящий из записей, каждая запись в одной или нескольких строках, разделенных пустыми строками. Я пытаюсь сгенерировать записи, используя потоки Java, и возникают проблемы

import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.util.stream.*;

public class Jstream {
    public static void main(String[] args) {
        new Jstream().run(args);
    }

    private void run(String[] args) {
        String input = (args.length == 0) ? "test.in" : args[0];

        try 
        {
            Path path = Paths.get(input);
            FileReader reader = new FileReader(input);
            Scanner scanner = new Scanner(reader).useDelimiter("^\\s*$");

            Stream<String> streamOfRecords = StreamSupport.stream(
                    Spliterators.spliteratorUnknownSize(scanner,
                            Spliterator.ORDERED), false);

            List<String> result =
                streamOfRecords
                    .map(l -> l.replaceAll("\n", " "))
                    .map(l -> l.replaceAll("\r", " "))
                    .map(String::trim)
                    .collect(Collectors.toList());

            for(String s : result)
                System.out.println("-> " + s);

        } catch(Exception e)
        {
            System.out.println(e.toString());
        }
    }
}

Ввод может быть

this is
a
single record

here is the next record followed by a line with just a space

finally
our
last
record

Я бы хотел увидеть что-то вроде

-> this is a single record
-> here is the next record followed by a line with just a space
-> finally our last record

Мне все равно, сколько пробелов между словами в записи, если их хотя бы 1. Я заставил его работать для useDelimiter ("\ n \ n"), но если пустая строка имела пробел это не удалось.

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Пожалуйста, смотрите ниже код:

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

      List<String> lines = stream.collect(Collectors.toList());
      String[] pLines = lines.stream()
          .reduce("", (line1, line2) -> line2.isEmpty() ? line1 + "#" + line2 : line1 + " " + line2)
          .split("#");

      Arrays.asList(pLines).stream().forEach(line -> System.out.println(line));
    } catch (IOException e) {
      e.printStackTrace();
    }
0 голосов
/ 18 июня 2019

Вам необходимо установить многострочный режим в регулярном выражении разделителя.Без этого ^ и $ проверяют только начало и конец всего текстового содержимого, а не начало и конец каждой строки.Вы можете установить многострочный режим с помощью флага (?m) в начале оператора регулярного выражения.

Scanner scanner = new Scanner(reader).useDelimiter("(?m)^\\s*$");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...