在java中查找非常大的格式化文本文件中的字符串

时间:2014-07-30 18:46:52

标签: java regex

这是事情: 我有一个非常大的文本文件,它有这样的格式:

0007476|000011434982|00249626000|R|2008-01-11 00:00:00|9999-12-31 23:59:59|000019.99
0007476|000014017887|00313865000|R|2011-04-19 00:00:00|9999-12-31 23:59:59|000599.99
...
...

我需要查找文件中是否存在特定模式,比如说

0007476|whatever|00313865000|whatever

我需要的只是一个布尔表示是或否。 现在我所做的是逐行读取文件并进行正则表达式匹配:

Pattern pattern = Pattern.compile(regex);
Scanner scanner = new Scanner(new File(fileName));
        String line;
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            if (pattern.matcher(line).matches()) {
                scanner.close();
                return true;
            }
        }

并且正则表达式具有

的形式
"0007476\|\d{12}\|0031386500.*

此方法有效,但搜索远离起始行的字符串通常需要15秒。有没有更快的方法来实现这一目标?感谢

2 个答案:

答案 0 :(得分:1)

java String class有一个contains方法,它返回一个布尔值。如果您的字符串是固定的,这比正则表达式要快得多:

if (string.contains("0007476|") && string.contains("|00313865000|")) {
   // whatever
}

希望有帮助,如果没有,请发表评论。

答案 1 :(得分:1)

我认为您需要Scanner,因为该文件太大而无法读入单个String

如果这种情况,您可以使用直接找到匹配项的正则表达式。根据您是否关心行开头的特定文本,您可以使用以下内容:

"(?m)^0007476\|\d{12}\|0031386500.*$

如果由于内存使用需要将其分解为较小的块,我建议不要逐行读取(因为行很短),但是使用像{{1}这样的东西来处理更大的块而不是?


我用一个1.25GB的文件摆弄了一下,以下是你的实现速度的2.5倍:

BufferedReader