我将从发布文本文件中的数据开始,这只有 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, 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 DO NOT BOOK
,然后忽略该行的读取,文本部分第 2 行的所有信息也将被忽略,但在文本文件本身中它都在一条线上。然后使用这些数据,我想将每一 block 保存到一个变量中。或者,表示 HOLD DO NOT BOOK
的数据部分有时格式如下:DO NOT BOOK
,HOLD - DO NOT BOOK
,如果正则表达式找到任何这些,它可以忽略该行前后的所有数据。
另外,如果可以的话,我想把其中有 PM 的时间加上 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 小时格式,然后根据第 4 条数据(STH 1102
) 我调用了一个插入函数,该函数将使用 ODBC 驱动程序将行中的其他数据插入到数据库中
最佳答案
那些看起来像字段之间的选项卡。如果我是你,我会使用非正则表达式文本操作来拆分 \t
字符上每三行中的第一行。那应该给你 STH 1102
和 HOLD DO NOT BOOK
没有任何进一步的处理。
剩下 星期五
、5:00
和 11:59
。您仍然可以通过文本操作获得那些:在逗号上拆分 Friday, September
并获取第一段,然后在字符串 上拆分
(连字符,两边有空格)。5:00AM - 11:59PM
>-
如果你仍然想要正则表达式,你可以使用 "[A-Za-z]+(?=,)"
和 "(\\d{1,2} :\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)"
。第二种模式将在捕获组 1 和 2 中返回您想要的时间。
整个事情的正则表达式可能不是最好的方法,但这可能会起作用:
"^([^,]+),.*\\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)"
,或非正则表达式字符串操作.
此外,如果在第一个“时间”值之前实际上有一个制表符,那可能会弄乱定位。拆分该选项卡上的字符串并使用我在右侧部分描述的 substring
方法。左侧部分可以在 ,
上拆分以查找星期几。
关于java - 使用正则表达式从文本文件中剥离数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432018/