我正在使用以下groovy代码在文件中搜索字符串,即帐号。我正在阅读的文件大约30MB,包含80,000-120,000行。有没有更有效的方法在包含给定AcctNum的文件中查找记录?我是新手,所以我不知道要调查哪个区域,toList()
或for-loop。谢谢!
AcctNum = 1234567890
if (testfile.exists())
{
lines = testfile.readLines()
words = lines.toList()
for (word in words)
{
if (word.contains(AcctNum)) { done = true; match = 'YES' ; break }
chunks += 1
if (done) { break }
}
}
答案 0 :(得分:3)
不幸的是,我甚至不已经安装在我目前的笔记本电脑Groovy的 - 但我不希望你有toList()
在所有来电。我也希望你能在闭包中表达这个条件,但是我必须参考Groovy in Action来检查......
话虽如此,你真的需要它分成几行吗?您是否可以使用getText()
阅读整篇文章,然后只需拨打contains()
一次?
编辑:好的,如果您需要查找包含记录的实际行,您需要拨打readLines()
,但我认为您之后不需要致电toList()
。你应该可以使用:
for (line in lines)
{
if (line.contains(AcctNum))
{
// Grab the results you need here
break;
}
}
答案 1 :(得分:1)
当你说高效时,你通常必须决定你的意思:它是应该快速运行,还是尽量少用资源(内存,...)。通常两者都位于相反的位置,你必须选择权衡。
如果你想搜索内存友好的话,我建议逐行阅读文件,而不是一次性读取它我怀疑它确实存在(我会错在那里,但在其他语言中,像readLines读取的内容)将整个文件放入一个字符串数组中。)
如果你想让它快速运行,我建议,如前所述,立即读取整个文件并寻找给定的模式。您可以使用indexOf来获取位置,然后根据需要从该位置读取记录,而不是仅使用contains进行检查。
答案 2 :(得分:0)
我应该更好地解释一下,如果我找到了AcctNum的记录,我会在记录中提取出其他信息......所以我认为我需要将文件拆分成多行。
答案 3 :(得分:0)
如果您控制正在阅读的文件的格式,解决方案是添加索引。
实际上,这就是数据库能够如此快速地定位记录的方式。
但是对于30MB的数据,我认为一台具有不错硬盘的现代计算机应该可以解决问题,而不是使程序复杂化。