1

我将首先发布文本文件中的数据是什么样的,这只是其中的 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 行的所有信息也被忽略,但在文本文件本身中它是全部在一条线上。然后使用这些数据,我想将每一块保存到一个变量中。或者相反,数据的一部分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());
        }
    }

我知道这个问题,希望你明白我在问什么,如果有不清楚的地方问,谢谢!牛肉。

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

4

2 回答 2

3

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

留下Friday,5: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]+(?=,)"and "(\\d{1,2}:\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)",或非正则表达式字符串操作。

此外,如果在第一个“时间”值之前实际上有一个选项卡,那可能会打乱定位。拆分该选项卡上的字符串并使用substring我在右侧部分描述的方法。可以拆分左侧部分,以查找星期几。

于 2011-09-15T14:24:46.167 回答
0

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

于 2011-09-15T14:25:44.133 回答