使用regex从文本文件中剥离数据



我将从发布文本文件中的数据开始,这只是其中的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中获得的数据,然后忽略该行的读取,文本部分第二行的所有信息也被忽略,但在文本文件本身中,它都在一行上。然后有了这些数据,我想把每一块都存到一个变量中。或者代替HOLD DO NOT BOOK部分的数据有时被格式化为:DO NOT BOOK, HOLD - DO NOT BOOK,如果regex找到任何这些,它可以忽略该行前后的所有数据。

如果可以的话,我还想把包含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驱动程序,以便将其他数据从行插入到数据库

这些看起来像是字段之间的制表符。如果我是您,我会使用非正则文本操作来拆分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中的时间。

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)",或者非正则字符串操作。

同样,如果在第一个"time"价值,这可能会打乱定位。在该选项卡上分割字符串,并使用我在右侧部分描述的substring方法。左边的部分可以在,上分割,以找到一周中的几天。

我认为使用StringTokenizerString.split()拆分文本并按其在字符串中的位置访问每个部分是值得的。一个正则表达式将是脆弱的,更复杂的编写。

相关内容

  • 没有找到相关文章

最新更新