1

次のグルーヴィーなコードを使用して、ファイルで文字列、口座番号を検索しています。私が読んでいるファイルは約 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

効率的と言うときは、通常、どちらの方向を意味するかを決定する必要があります。高速に実行するか、リソース (メモリなど) をできるだけ少なく使用するかです。多くの場合、両方とも反対のサイトにあり、トレードオフを選択する必要があります。

メモリにやさしい検索をしたい場合は、ファイルを一度に読み取るのではなく、1 行ずつ読み取ることをお勧めします。文字列の配列)。

すばやく実行したい場合は、既に述べたように、ファイル全体を一度に読み取り、指定されたパターンを探すことをお勧めします。内容を確認するだけでなく、indexOf を使用して位置を取得し、必要に応じてその位置からレコードを読み取ることができます。

于 2009-03-04T22:59:50.467 に答える
0

読み込んでいるファイルの形式を制御する場合、解決策はインデックスを追加することです。

実際、これがデータベースがレコードを非常に迅速に見つける方法です。

しかし、30MB のデータの場合、プログラムを過度に複雑にするのではなく、まともなハードドライブを搭載した最新のコンピューターでうまくいくはずです。

于 2009-03-05T10:56:22.227 に答える
0

AcctNum を含むレコードが見つかった場合は、そのレコードに関する他の情報を抽出するので、ファイルを複数の行に分割する必要があると考えました。

于 2009-03-04T22:33:44.837 に答える