当前位置: 首页 > 面试题库 >

Java读取文件行并仅提取有用的信息

程胤运
2023-03-14
问题内容

我有文件file1,file2包含以下内容:

[2017-02-01 10:00:00 start running [error:yes] [doing:no] [finish:] [remind:] [alarmno:123456789] [logno:123456789] [ref:-1:2:-1:-1:-1] [type:2:big issues happen] [flag:0:]]<-此行1

第2行:除日期,类型,登录号和警报号外,同一行1有时包含+或-号。…其他行我已经将所有这些行读到字符串列表myLines。(请注意:file1的内容将是myLines的第一个元素,以
逗号 分隔,而myLines 的第二个元素将是file2的内容,以逗号分隔,依此类推。例如,这是myLines列表的第一个元素:

[2017-02-01 10:00:00 start running [error:yes] [doing:no] [finish:] [remind:] [alarmno:123456789] [logno:123456789] [ref:-1:2:-1:-1:-1] [type:2:big issues happen] [flag:0:],
2017-02-01 10:00:00 start running [error:yes] [doing:no] [finish:] [remind:] [alarmno:123456789] [logno:123456789] [ref:-1:2:-1:-1:-1] [type:2:big issues happen] [flag:0:]]

<-–这是myLines的第一个元素列出其file1的内容。如果文件包含一行,则意味着myLines列表的第一个元素将仅包含该行且不用逗号分隔。我只想要

  1. 每行第一行的 日期
  2. 所述 alarmno (仅数字没有,而不是在上面的行中为exmample字:123456789)
  3. 上一行的 登录编号 (123456789)
  4. 类型 在上面的行下面的文字,例如(大问题发生)

这是我尝试的:

String regex = "\\d{2}:\\d{2}:\\d{2}\\s+\\w*\\s+\\w*\\s+\\[\\w*:\\w*]\\s+\\[\\w*:\\]\\s+\\[\\w*:\\]\\s+\\[\\w*:\\]";
String s=null;
for(int i=0; i<myLines.size(); i++)
   {
     s = myLines.get(i).replaceAll(regex," ");
   }

但是结果是日期和Alarmno:12345 …以及其他行内容。我什至试图重复这种表达,但对我没有帮助。有什么方法可以在Java中实现吗?


问题答案:

您可以使用

^\[?(\d[\d-]+).*?\[alarmno:(\w*)].*?\[logno:(\w*)].*?\[type:\w*:([^\]]*)]

参见正则表达式演示

详细资料

  • ^ -字符串开始
  • \[? -可选 [
  • (\d[\d-]+)-第1组:一个数字和1个或多个数字或-s
  • .*? -除换行符以外的任何0+字符都应尽可能少
  • \[alarmno:- [alarmno:子字符串
  • (\w*) -第2组:0个以上的字符字符
  • ] -文字 ]
  • .*? -除换行符以外的任何0+字符都应尽可能少
  • \[logno:-文字[logno:子串
  • (\w*) -第3组:0个以上的字符字符
  • ] - 一个 ]
  • .*? -除换行符以外的任何0+字符都应尽可能少
  • \[type:- [type:子字符串
  • \w* -0+个字元
  • : -冒号
  • ([^\]]*) -第4组:0个以上的字符,除 ]
  • ] - 一个 ]

Java演示:

String s = "[2017-08-17 08:00:00 Comming in [Contact:NO] [REF:] [REF2:] [REF3:] [Name:+AA] [Fam:aa] [TEMP:-2:0:-2:0:-2] [Resident:9:free] [end:0:]";
Pattern pat = Pattern.compile("^\\[*(\\d[\\d: -]+\\d).*?\\[Name:([^]]*)].*?\\[Fam:(\\w*)].*?\\[Resident:\\w*:([^]]*)]");
Matcher matcher = pat.matcher(s);
if (matcher.find()){
    System.out.println("Date: " + matcher.group(1));
    System.out.println("Name: " + matcher.group(2)); 
    System.out.println("Fam: " + matcher.group(3)); 
    System.out.println("Resident: " + matcher.group(4)); 
}

输出:

Date: 2017-08-17 08:00:00
Name: +AA
Fam: aa
Resident: free


 类似资料:
  • 问题内容: 我只想读取文本文件的第一行并将该第一行放在字符串数组中。 这就是我所拥有的,但是它读取了整个文件。 myTextFile中的ex文本: 问题答案: 如果我了解你,那

  • 问题内容: 我有一个大文件,需要阅读并制作字典。我希望尽快。但是我在python中的代码太慢了。这是显示问题的最小示例。 首先制作一些假数据 现在,这里是一个最小的python代码片段,可以读入它并制作一个字典。 时间: 但是,可以更快地读取整个文件,如下所示: 我的CPU有8个核心,是否可以在python中并行化此程序以加快速度? 一种可能是读取大块输入,然后在不同的非重叠子块上并行运行8个进程

  • 本文向大家介绍基于python读取.mat文件并取出信息,包括了基于python读取.mat文件并取出信息的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了基于python读取.mat文件并取出信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 导入所需包 读取.mat文件 随便从下面文件里读取一个: 读出来的m内容: 取出.mat里所

  • 问题内容: 我想将1 GB大文件的所有行尽快读取到中。目前,我正在为此使用。解析文件后,我要进行一些计算(/ )。 起初我以为这已经并行完成了,但是似乎我错了:当按原样读取文件时,在我的双CPU笔记本电脑上大约需要50秒钟。但是,如果我使用bash命令拆分文件,然后并行处理它们,则只需要30秒钟。 我尝试了以下组合: 单个文件,没有并行lines()流〜50秒 单个文件,约50秒 两个文件,无平行

  • 因此,我一直在使用Python3.2和OpenPyXL的iterable工作簿,如这里的“优化阅读器”示例所示。 当我尝试使用此策略读取从简单文档中提取的一个或多个文件时,就会出现问题。zip存档(手动和通过python zipfile包)。当我调用我得到“A”和我得到1,当要求打印每个单元格的值时,如下所示: 它打印A1、A2、A3、A4、A5、A6和A7中的值,而不管文件实际有多大。文件本身没

  • 问题内容: 我正在尝试实现基本的词法分析器。目前,我在文件解析方面陷入困境。 这是我的栏位,称为“ p ++。ppp” 解析文件时,我得到:但是p ++。ppp是文件名! 同样,当我调试时,它读取文件名,然后退出。我想念什么? 问题答案: 您误解了的API 。从文档的构造函数: 构造一个新的Scanner,该扫描器生成从指定字符串扫描的值。 参数: 源 -一个字符串,扫描 这不是文件名-只是一个字