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

时间:2011-09-15 13:54:24

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

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

以下是从文件Friday5:0011:59STH 1102HOLD DO NOT BOOK获取的数据ID,然后忽略读取该行,文本部分第二行的所有信息也被忽略,但在文本文件本身中,它都在一行上。然后使用这些数据,我想将每个部分保存到变量中。或者,代表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());
        }
    }

我知道这个问题的主题,希望你明白我要问的是什么,如果有什么不清楚就问,谢谢!牛肉。

更新:我想也许这有助于解释我对此数据的意图,首先我会将任何PM时间转换为24小时格式,然后根据第4条数据(STH 1102)我调用一个插入函数,该函数将使用ODBC驱动程序将该行中的其他数据插入数据库

2 个答案:

答案 0 :(得分:3)

这些看起来像字段之间的标签。如果我是你,我会使用非正则表达式文本操作来分割\t字符中每三行中的第一行。这应该会给你STH 1102HOLD DO NOT BOOK而无需进一步处理。

Friday5:0011: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方法。左侧部分可以在,上拆分,以查找星期几。

答案 1 :(得分:0)

我认为值得使用StringTokenizerString.split()拆分文本,并通过它在字符串中的位置访问每个部分。正则表达式就像脆弱一样,写起来也要复杂得多。