Java 使用正则表达式从文本文件中剥离数据
我将从发布文本文件中的数据开始,这只是其中的4行,实际上文件有几百行长Java 使用正则表达式从文本文件中剥离数据,java,regex,text,fileinputstream,datainputstream,Java,Regex,Text,Fileinputstream,Datainputstream,我将从发布文本文件中的数据开始,这只是其中的4行,实际上文件有几百行长 Friday, September 9 2011 5:00AM - 11:59PM STH 1102 HOLD DO NOT BOOK Report Printed on 9/08/2011 at 2:37 PM Page 1 of 1 Friday, Sept
Friday, September 9 2011 5:00AM - 11:59PM STH 1102 HOLD DO NOT BOOK
Report Printed on 9/08/2011 at 2:37 PM Page 1 of 1
Friday, September 9 2011 5:00AM - 11:00PM STH 4155 (BOARDROOM) HOLD - DO NOT BOOK
Hold - Do Not Book Report Printed on 9/08/2011 at 2:37 PM Page 1 of 1
Friday, September 9 2011 5:00AM - 11:59PM UC 2 (COMPUTER LAB) HOLD DO NOT BOOK
do not book Report Printed on 9/08/2011 at 2:37 PM Page 1 of 1
Friday, September 9 2011 5:00PM - 11:00PM AH GYM USC ORIENTATION 2011 - REVISED
USC Orientation 2011 Report Printed on 9/08/2011 at 2:37 PM Page 1 of 1
文本的每一小段都在文本文件中的一行上,由许多空格分隔,由于某些原因,这些空格不会出现在问题格式中。我将使用文本的第一段作为示例,说明我试图获取的数据
这是我想从文件Friday
,5:00
,11:59
,STH 1102
,中获取的数据,然后忽略该行的读取,文本部分第二行的所有信息都可以忽略,但在文本文件本身中,所有信息都在一行上。然后有了这些数据,我想把每一部分都保存到一个变量中。或者,表示HOLD don BOOK
的数据部分有时格式如下:don BOOK
,HOLD-don BOOK
,如果正则表达式发现其中任何一个,它可以忽略该行前后的所有数据
此外,如果你我可以,我想采取的时间,有下午在他们和增加12到他们,使他们在24小时的格式
以下是我目前阅读全文的方式。然后,一旦用户将路径放入scheduleTxt JTextfield,我就调用这个函数。它可以很好地读取和打印每一行
public void readFile () throws IOException
{
try
{
FileInputStream fstream = new FileInputStream(scheduleTxt.getText());
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null)
{
System.out.println (str1);
}
in.close();
}
catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
我知道这个问题有很多,希望你能理解我的问题,如果有什么不清楚的地方,就直接问吧,谢谢!牛肉
更新:我只是想也许这会有助于解释我对这些数据的意图,首先我会将任何下午时间转换为24小时格式,然后根据第四条数据(STH 1102
)我调用一个insert函数,该函数将使用ODBC驱动程序将行中的其他数据插入数据库,这些数据看起来像字段之间的选项卡。如果我是你,我会使用非正则表达式文本操作来分割\t
字符上每三行的第一行。这应该会给你STH 1102
和HOLD don't BOOK
,没有任何进一步的处理
剩下的是星期五、5:00和11:59。您仍然可以通过文本操作获得这些片段:在逗号上拆分9月5日星期五
,然后在字符串上拆分5:00AM-11:59PM
(一个连字符,周围有空格)
如果仍然需要这些正则表达式,可以分别使用“[A-Za-z]+(?=,)”
和”(\\d{1,2}:\\d{2}[PA]M)-(\\d{1,2}:\\d{2}[PA]M)
。第二个模式将返回捕获组1和2中所需的时间
对于整个事情来说,Regex可能不是最好的方法,但这可能会起作用:
"^([^,]+),.*\\t(\\d{1,2}:\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)\\t([^\\t]+)\\t([^\\t]+)$"
您需要的值将位于捕获组1-5中
编辑:
因为您已经指出这些不是组之间的选项卡,所以上面的正则表达式将无法正常工作。但是,这可能意味着字段位于固定位置。找出每个组从哪个索引开始,然后使用String.substring
选择从那里到下一个组的所有内容,并String.trim
结果。然后,您可以像我上面描述的那样处理星期几和时间部分:“[A-Za-z]+(?=,)”
和“(\\d{1,2}:\\d{2}[PA]M)-(\\d{1,2}:\\d{2}[PA]M)”
,或非正则字符串操作
此外,如果在第一个“时间”值之前实际上有一个选项卡,则可能会扰乱定位。拆分该选项卡上的字符串,并使用我在右侧部分描述的子字符串
方法。左侧部分可以在,
上拆分以查找一周中的哪一天。我认为使用StringTokenizer
或String.split()
拆分文本并按其在字符串中的位置访问每个部分是值得的。正则表达式同样脆弱,编写起来也要复杂得多。行中的“字段”位于固定位置?看起来第一个字段(您想要的)位于固定位置,因此不需要正则表达式,只需在该位置使用子字符串。是的,我猜它们都位于固定位置,但文本文件每天都在更改,因此我想我宁愿在固定位置更改时进行正则表达式搜索,如果第一个时间字段为10,11,或者12它的位置将比1-9早1个位置我刚刚检查了它们是否是选项卡,但它们不是选项卡,选项卡上唯一的数据是第一次数据,我希望我可以显示实际的文本文件,但每一行都太长,无法放入单个屏幕快照,并且正则表达式行不起作用,我不知道这是否是因为我没有提到周五之前也有大量的空白,所以当你说每组从哪个索引开始时,你的意思是像周五开始30个空格,然后5:00开始86个空格?诸如此类on@Beef-星期五<代码>不是从位置0开始吗?您可能希望分别分析每一行。我所说的索引是字符串中某个特定值开始的位置,因此它是您将馈送到string.substring
的数字。这有意义吗?不,在实际的文本文件中,它不是从0开始的,我必须大大减少所有数据之间的空格量,以减少问题中的混乱程度,我不确定我是否完全理解,我很确定我了解子字符串
和修剪
的用法,只是不知道在这种情况下如何使用子字符串
,据我所知,它用于生成一个大字符串,并在某些字符上对其进行分解,类似于php中的explode函数,但是没有ITE的数组部分例如:如果STH 1102
部分总是从行中的80位开始,而HOLD DO NOT BOOK
从100位开始,您可以执行类似于stringroomnumber=line.substring(80,99).trim()的操作;字符串cl