1

我正在使用以下 groovy 代码在文件中搜索字符串、帐号。我正在阅读的文件大约 30MB,包含 80,000-120,000 行。有没有更有效的方法在包含给定 AcctNum 的文件中查找记录?我是新手,所以我不知道要研究哪个区域,toList()或者 for 循环。谢谢!

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

4 回答 4

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;
  }
}
于 2009-03-04T22:27:24.040 回答
1

当您说高效时,您通常必须确定您的意思是:它应该快速运行,还是使用尽可能少的资源(内存,...)。通常两者都位于相反的位置,您必须做出权衡。

如果你想搜索内存友好,我建议逐行读取文件,而不是一次读取它,我怀疑它会这样做(我会错在那里,但在其他语言中,像 readLines 之类的东西会将整个文件读入字符串数组)。

如果您希望它快速运行,我建议,如前所述,一次读取整个文件并查找给定的模式。您可以使用 indexOf 获取位置,然后根据需要从该位置读取记录,而不是仅检查 contains。

于 2009-03-04T22:59:50.467 回答
0

如果您控制正在阅读的文件的格式,则解决方案是添加索引。

事实上,这就是数据库能够如此快速地定位记录的方式。

但是对于 30MB 的数据,我认为具有不错硬盘驱动器的现代计算机应该可以解决问题,而不是使程序过于复杂。

于 2009-03-05T10:56:22.227 回答
0

我应该更好地解释它,如果我找到带有 AcctNum 的记录,我会提取记录中的其他信息......所以我认为我需要将文件拆分为多行。

于 2009-03-04T22:33:44.837 回答