【问题标题】:strip data from a text file从文本文件中剥离数据
【发布时间】:2011-09-14 16:17:32
【问题描述】:

我将首先发布文本文件中的日期,这只有 4 行,实际文件有几百行。

2011 年 9 月 9 日,星期五
-STV 101--------05:00 - 23:59 SSB 4185 报告于 2011 年 9 月 8 日 2:37 打印

0-AH 104--------07:00 - 23:00 AH 健身房报告于 2011 年 9 月 8 日 2:37 打印

-BG 105--------07:00 - 23:00 SH GREAT HALL 报告于 2011 年 9 月 8 日 2:37 打印

我想要对这个文本文件执行的操作是忽略上面有日期的第一行,然后忽略下一行的“-”,但读入“STV 101”、“5:00”和“ 23:59" 将它们保存到变量中,然后忽略该行上的所有其他字符,然后对于之后的每一行以此类推。

这是我目前完全阅读这些行的方式。然后,一旦用户将路径放入 scheduleTxt JTextfield 中,我就调用此函数。它可以很好地读取和打印每一行。

public void readFile() 抛出 IOException
{
    尝试
    {
        FileInputStream fstream = new FileInputStream(scheduleTxt.getText());
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        字符串strLine;

        而 ((strLine = br.readLine()) != null)
        {
            System.out.println(strLine);
        }
        附寄();
    }
    catch (Exception e){//如果有异常捕获
        System.err.println("错误:" + e.getMessage());
    }
}

更新:事实证明我还需要从第一行中删除 Friday 并将其放入一个变量中 谢谢!牛肉。

【问题讨论】:

    标签: java regex fileinputstream datainputstream


    【解决方案1】:

    没有彻底测试它,但是这个正则表达式会在第 2、5 和 7 组中捕获您需要的信息:(假设您只对“0-AH 104”示例中的“AH 104-- --") ^(\S)*-(([^-])*)(-)+((\S)+)\s-\s((\S)+)\s(.)*

        String regex = "^(\\S)*-(([^-])*)(-)+((\\S)+)\\s-\\s((\\S)+)\\s(.)*";
        Pattern pattern = Pattern.compile(regex);
        while ((strLine = br.readLine()) != null){
            Matcher matcher = pattern.matcher(strLine);
            boolean matchFound = matcher.find();
            if (matchFound){
                String s1 = matcher.group(2);
                String s2 = matcher.group(5);
                String s3 = matcher.group(7);
                System.out.println (s1 + " " + s2 + " " + s3);
            }
    
        }
    

    可以使用非捕获组调整表达式,以便仅捕获您想要的信息。

    正则表达式元素说明:

    1. ^(\S)*- 匹配以- 结尾的非空白字符组。 注意:可能是 ^(.)*-,如果第一个 - 之前有空格,则不会工作。
    2. (([^-])*) 匹配除- 之外的每个字符的组。
    3. (-)+ 匹配一个或多个 - 的组。
    4. ((\S)+) 匹配一个或多个非空白字符的组。这在第 5 组中被捕获。
    5. \s-\s 匹配一组空白,后跟-,后跟空白。
    6. '((\S)+)' 与 4 相同。这在第 7 组中捕获。
    7. \s(.)* 匹配空格后跟任何内容,将被跳过。

    更多关于正则表达式的信息可以在tutorial 上找到。 周围还有几个有用的cheatsheets。在设计/调试表达式时,regexp testing tool 也非常有用。

    【讨论】:

    • 是的,在“0-AH 104----”的情况下,我只想要“AH 104”,谢谢,我试一试,看看我得到了什么!
    • 更新:效果很好,使用更广泛的文本文件版本对其进行了测试,并且没有问题,再次感谢
    • 我在答案的表达式上添加了元素的解释,以供进一步参考
    • @Beef 如果文件格式是固定的,你可以在测试表达式之前在字符串中查找,,并保留strLine.split(",")[0]
    • 我刚刚被告知我可能正在使用与此不同的格式,但我会反对它,但如果我必须使用不同的格式,希望我可以使用您的编辑帮助对正则表达式搜索进行相应更改的答案
    猜你喜欢
    • 2018-04-03
    • 2011-06-04
    • 1970-01-01
    • 2022-12-27
    • 1970-01-01
    • 2022-01-18
    • 2011-06-18
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多