如何使这个Groovy字符串搜索代码更有效?

时间:2009-03-04 22:18:28

标签: groovy for-loop

我正在使用以下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 }
  }
}

4 个答案:

答案 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的数据,我认为一台具有不错硬盘的现代计算机应该可以解决问题,而不是使程序复杂化。