簡體   English   中英

匹配模式,並使用Java 8 Stream將流寫入文件

[英]Match a pattern and write the stream to a file using Java 8 Stream

我正在嘗試讀取一個大文件,並將“引號”中的文本提取出來,然后將行放入集合中,然后使用Java 8 Stream將集合的內容寫入文件中。

public class DataMiner {

    private static final Pattern quoteRegex = Pattern.compile("\"([^\"]*)\"");

    public static void main(String[] args) {

        String fileName = "c://exec.log";
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
            Set<String> dataSet = stream.
                    //How do I Perform pattern match here
                    .collect(Collectors.toSet());
            Files.write(Paths.get(fileName), dataSet);

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

    }
}

請幫我。 謝謝!

編輯:問題的答案。

  1. 不,沒有多引號的文字。
  2. 我本可以使用簡單的循環。 但是我想使用Java 8流

不幸的是,Java正則表達式類不提供匹配結果的流,僅提供splitAsStream()方法,但您不希望拆分。

注意:它已在Java 9中作為Matcher.results()添加

但是,您可以自己為其創建通用幫助器類:

public final class PatternStreamer {
    private final Pattern pattern;
    public PatternStreamer(String regex) {
        this.pattern = Pattern.compile(regex);
    }
    public Stream<MatchResult> results(CharSequence input) {
        List<MatchResult> list = new ArrayList<>();
        for (Matcher m = this.pattern.matcher(input); m.find(); )
            list.add(m.toMatchResult());
        return list.stream();
    }
}

然后,使用flatMap()您的代碼變得容易:

private static final PatternStreamer quoteRegex = new PatternStreamer("\"([^\"]*)\"");
public static void main(String[] args) throws Exception {
    String inFileName = "c:\\exec.log";
    String outFileName = "c:\\exec_quoted.txt";
    try (Stream<String> stream = Files.lines(Paths.get(inFileName))) {
        Set<String> dataSet = stream.flatMap(quoteRegex::results)
                                    .map(r -> r.group(1))
                                    .collect(Collectors.toSet());
        Files.write(Paths.get(outFileName), dataSet);
    }
}

由於您一次只處理一行,因此臨時List是可以的。 如果輸入字符串很長並且匹配很多,那么使用Spliterator將是一個更好的選擇。 請參閱如何創建正則表達式匹配流?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM