如何在Java中对文件进行模式匹配和显示相邻行

最近,我们在jOOλ0.9.9中发布了有关超棒的窗口函数支持的文章 ,我相信这是对我们所做的库的最佳补充。

今天,我们将在一个用例中研究窗口函数的出色应用,该用例受到以下堆栈溢出问题Sean Nguyen的启发:

如何从Java 8流(如grep)匹配前后获取行?

我有一个文本文件,其中有很多字符串行。 如果我想在grep中找到匹配之前和之后的行,我会这样做:

grep -A 10 -B 10 "ABC" myfile.txt

如何使用流在Java 8中实现等效功能?

所以问题是:

如何使用流在Java 8中实现等效功能?

jool-logo 好吧,unix shell及其各种“可点入”命令是唯一比窗口函数更强大(更神秘)的东西。 能够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()函数的工作方式与它们的SQL等效项相同 。

但是与SQL不同的是,用Java(或其他通用语言)编写函数比较简单,因为涉及的语法较少。 我们可以轻松地在窗口框架上进行聚合,以收集“滞后”和“领先”匹配的通用行数。 考虑以下替代方法:

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:                       ? "+"

它还能变得更简洁吗? 我不这么认为。 上面的大多数逻辑只是在行旁边生成索引。

结论

窗口功能非常强大。 最近关于reddit的讨论(关于我们先前关于jOOλ的窗口函数支持的文章)显示,其他语言也支持基元来构建类似的功能。 但是通常,这些构造块并不像jOOλ中所公开的那样简洁,这是受SQL启发的。

通过模仿SQL的窗口函数,在内存数据流上进行强大的操作时,只有很小的认知摩擦。

在以下文章中了解有关窗口函数的更多信息:

  • 可能最酷的SQL功能:窗口函数
  • 使用此整齐的窗口函数技巧来计算时间序列中的时差
  • 如何在SQL中找到最长的连续事件系列
  • 不要错过具有FIRST_VALUE(),LAST_VALUE(),LEAD()和LAG()的超凡SQL能力
  • ROW_NUMBER(),RANK()和DENSE_RANK()之间的区别

翻译自: https://www.javacodegeeks.com/2016/01/pattern-match-files-display-adjacent-lines-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

64位内核第二讲,进程保护之对象钩子

64位内核第二讲,进程保护. 一丶什么是保护. 什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内核已经做了保护. 那么去掉保护的前提就是你要给自己的软件做保护. 比如我们给计算器做保护. 例如下图. 做保护.以前的病毒作者.都是想要退出…

java 类 request_java普通类得到request对象

使用拦截器import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.…

Xamarin.Forms Button长按事件

Xamarin.Forms Button长按事件 在平时的开发中,我们经常遇到需要Button能够拥有长按事件,但是在Xamarin.Forms中Button并没有该事件, 此时我们如何来实现呢? 我们知道在Xamarin.Forms中可以通过CustomRenderer来根据不同平台各自处…

java对象写入文件_将Java对象写入文件中

Java对象序列化 首先介绍一下对象序列化的目标:对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。 一、序列化的含义和意义: 序列化机制使得对象可以脱离程序的运行而独立存在。 对象的序列化指将一个Java对象写入IO流中,与此对应的反是,对象的反序列化…

jpql hql_无需部署即可测试JPQL / HQL

jpql hql您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL? 我们今天在这里看到的是适用于任何JPA实现的简单解决方案:Hibernate,OpenJPA,EclipseLink等。 这篇文章中找到的基本源代码来自本书:“ Pro JPA 2&a…

eclipse 代码上传github 笔记

第一步 先share project 如图所示 第二步 如果所示 第三步 点击 下面的create 然后点击完成 第四步提交 第五步: 第六步: 转载于:https://www.cnblogs.com/a8457013/p/8410471.html

java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

笔者以前学过C语言。众所周知,C也是一门面向对象程序设计语言。还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为然。现在在学java&#x…

[Usaco2008 Feb]Eating Together麻烦的聚餐

Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐。每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的位置就归第2批就餐的奶牛了…

Keycloak SSO集成到jBPM和Drools Workbench中

介绍 单一登录(SSO)和相关令牌交换机制正在成为Web上不同环境中进行身份验证和授权的最常见方案,尤其是在迁移到云中时。 本文讨论了Keycloak与jBPM或Drools应用程序的集成,以便使用Keycloak上提供的所有功能。 Keycloak是用于浏…

接口 java性能_接口测试性能测试

接口测试 接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 原理 通过测试程序模拟客户端向服务…

C 标准库 - string.h

C 标准库 - string.h This header file defines several functions to manipulate C strings and arrays.string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。库变量 size_t Unsigned integral type (type )这是无符号整数类型,它是 sizeof 关键…

Redis 小结

一、redis简介 redis是一款基于C语言编写的,开源的非关系型数据库,由于其卓越的数据处理机制(按照规则,将常用的部分数据放置缓存,其余数据序列化到硬盘),大家也通常将其当做缓存服务器来使用。…

NetBeans Java EE技巧#1 –数据库中的实体类

NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说,我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中,不仅Java EE的生产力提高了,而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBeans成为绝配&#x…

asp mysql添加数据_ASP:ado.net 实例向数据库添加数据。

我在这使用的是老师给的数据库1,web窗体设计。设计添加图书窗体,窗体属性有图书种类(下拉列表框控件),图书名称,作者,编号,出版社,价格均为文本框,日期(第三方日期控件),…

spring jmx_JMX和Spring –第1部分

spring jmx这是三篇文章的第一篇&#xff0c;这三篇文章将展示如何通过JMX支持为Spring应用程序赋能。 Maven配置 这是用于设置此示例代码的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

守口住嘴

守口 祸从口出 病从口入 住嘴 嘴能成事 亦能坏事 守口 祸从口出 病从口入 住嘴 嘴能成事 亦能坏事 转载于:https://www.cnblogs.com/fangtengfei/p/8416073.html

JAVA有percentile函数吗_Python numpy.percentile函数方法的使用

numpy.percentilenumpy.percentile(a, q, axisNone, outNone, overwrite_inputFalse, interpolationlinear, keepdimsFalse) [source]计算沿指定轴的数据的第q个百分位数。返回数组元素的第q个百分点。参数 &#xff1a;a &#xff1a;array_like输入数组或可以转换为数组的…

C代码的运行速度总是比Java快,对吧? 错误!

因此&#xff0c;我们都知道&#xff0c;Java解释缓慢且C的编译和优化运行速度非常快。 您可能知道&#xff0c;图片截然不同。 TL; DR Java适用于星座&#xff0c;它的速度更快&#xff0c;在JIT上可以执行内联&#xff0c;因为所有方法/功能都是可见的&#xff0c;而C编译器…

JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)

运用JS的innerHTML&#xff0c;和for循环实现日历小部件内容和日期的转换。 <!DOCTYPE html> <html> <head><title>日历小部件</title><style type"text/css">*{padding: 0;margin:0;}.tab{width:220px;background: #ccc;height…

Django-认证系统

知识预览 COOKIE 与 SESSION用户认证 回到顶部COOKIE 与 SESSION 概念 cookie不属于http协议范围&#xff0c;由于http协议无法保持状态&#xff0c;但实际情况&#xff0c;我们却又需要“保持状态”&#xff0c;因此cookie就是在这样一个场景下诞生。 cookie的工作原理是&…