java - 使用正则表达式从文本文件中剥离数据

标签 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, 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

文本文件的每一小节都在一行中,由许多空格分隔,由于某种原因,这些空格没有出现在问题格式中,我将使用文本的第一部分作为我正在尝试的数据的示例得到。

这是我想从文件 Frid​​ay, 5:00, 11:59, STH 1102 中获取的数据HOLD DO NOT BOOK,然后忽略该行的读取,文本部分第 2 行的所有信息也将被忽略,但在文本文件本身中它都在一条线上。然后使用这些数据,我想将每一 block 保存到一个变量中。或者,表示 HOLD DO NOT BOOK 的数据部分有时格式如下:DO NOT BOOKHOLD - 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 1102HOLD DO NOT BOOK 没有任何进一步的处理。

剩下 星期五5:0011:59。您仍然可以通过文本操作获得那些:在逗号上拆分 Frid​​ay, 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/

相关文章:

Python 正则表达式 Lookahead 多个条件

python - 如何使用 opencv 将 Monospace 字体插入到图像中?

perl - 使用 perl 将 RTF 转换为 TEXT

javascript - 如何将文本转换为输入?

java - 如何升级org.jboss.as.jmx :main in WildFly10

java - 如何只允许用户输入字符并进行验证?

java - 事件调度线程 - 报告

javascript - 使用正则表达式验证逗号分隔的数字列表

C# 正则表达式 : replace either of two matches with the same value

java - 如何编写一个方法将项目添加到链接列表并按字母顺序对它们进行排序?