如何在Java中对文件进行模式匹配和显示相邻行
最近,我們在jOOλ0.9.9中發(fā)布了有關超棒的窗口函數(shù)支持的文章 ,我相信這是對我們所做的庫的最佳補充。
今天,我們將在一個用例中研究窗口函數(shù)的出色應用,該用例受到以下堆棧溢出問題Sean Nguyen的啟發(fā):
如何從Java 8流(如grep)匹配前后獲取行?
我有一個文本文件,其中有很多字符串行。 如果我想在grep中找到匹配之前和之后的行,我會這樣做:
grep -A 10 -B 10 "ABC" myfile.txt如何使用流在Java 8中實現(xiàn)等效功能?
所以問題是:
如何使用流在Java 8中實現(xiàn)等效功能?
好吧,unix shell及其各種“可點入”命令是唯一比窗口函數(shù)更強大(更神秘)的東西。 能夠grep輸入文件中的某個字符串,然后顯示幾行的“窗口”非常有用。
但是,有了jOOλ0.9.9,我們也可以在Java 8中非常容易地做到這一點 。 考慮一下這個小片段:
Seq.seq(Files.readAllLines(Paths.get(new File("/path/to/Example.java").toURI()))).window().filter(w -> w.value().contains("ABC")).forEach(w -> {System.out.println();System.out.println("-1:" + w.lag().orElse(""));System.out.println(" 0:" + w.value());System.out.println("+1:" + w.lead().orElse(""));// ABC: Just checking});該程序將輸出:
-1: .window()0: .filter(w -> w.value().contains("ABC")) +1: .forEach(w -> {-1: System.out.println("+1:" + w.lead().orElse(""));0: // ABC: Just checking +1: });因此,我自己運行了該程序,并且找到了所有與“ ABC”匹配的行,以及前幾行(“ lagging” / lag() )和后幾行( lead() / lead() )。 這些lead()和lag()函數(shù)的工作方式與它們的SQL等效項相同 。
但是與SQL不同的是,用Java(或其他通用語言)編寫函數(shù)比較簡單,因為涉及的語法較少。 我們可以輕松地在窗口框架上進行聚合,以收集“滯后”和“領先”匹配的通用行數(shù)。 考慮以下替代方法:
int lower = -5; int upper = 5;Seq.seq(Files.readAllLines(Paths.get(new File("/path/to/Example.java").toURI()))).window(lower, upper).filter(w -> w.value().contains("ABC")).map(w -> w.window().zipWithIndex().map(t -> tuple(t.v1, t.v2 + lower)).map(t -> (t.v2 > 0 ? "+" : t.v2 == 0 ? " " : "") + t.v2 + ":" + t.v1).toString("\n"))我們得到的輸出是這樣的:
-5:int upper = 5; -4: -3:Seq.seq(Files.readAllLines(Paths.get( -2: new File("/path/to/Example.java").toURI()))) -1: .window(lower, upper)0: .filter(w -> w.value().contains("ABC")) +1: .map(w -> w.window() +2: .zipWithIndex() +3: .map(t -> tuple(t.v1, t.v2 + lower)) +4: .map(t -> (t.v2 > 0 +5: ? "+"它還能變得更簡潔嗎? 我不這么認為。 上面的大多數(shù)邏輯只是在行旁邊生成索引。
結論
窗口功能非常強大。 最近關于reddit的討論(關于我們先前關于jOOλ的窗口函數(shù)支持的文章)顯示,其他語言也支持基元來構建類似的功能。 但是通常,這些構造塊并不像jOOλ中所公開的那樣簡潔,這是受SQL啟發(fā)的。
通過模仿SQL的窗口函數(shù),在內(nèi)存數(shù)據(jù)流上進行強大的操作時,只有很小的認知摩擦。
在以下文章中了解有關窗口函數(shù)的更多信息:
- 可能最酷的SQL功能:窗口函數(shù)
- 使用此整齊的窗口函數(shù)技巧來計算時間序列中的時差
- 如何在SQL中找到最長的連續(xù)事件系列
- 不要錯過具有FIRST_VALUE(),LAST_VALUE(),LEAD()和LAG()的超凡SQL能力
- ROW_NUMBER(),RANK()和DENSE_RANK()之間的區(qū)別
翻譯自: https://www.javacodegeeks.com/2016/01/pattern-match-files-display-adjacent-lines-java.html
總結
以上是生活随笔為你收集整理的如何在Java中对文件进行模式匹配和显示相邻行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10玩不了一梦江湖解决方法(一梦江
- 下一篇: jpql hql_无需部署即可测试JPQ