0

パターンに一致するために必要なだけファイルをロードするだけで、ファイルの内容に対して Ruby パターンを一致させる方法はありますか?

たとえば、与えられたパターン

p = /(abc)*/

および内容を含むファイル f

abcabcdefdef

ファイルの最後の 3 文字 (「def」) をディスクから読み取らずに、p を f の内容と照合する方法はありますか? 基本的に、ファイルの任意の長さの部分に対してパターンを照合できるようにしながら、必要に応じてのみ大きなファイルをロードしたいと考えています。

4

1 に答える 1

1

Enumerator を使用して、ファイルのチャンクを遅延読み込みします。

CHUNK_SIZE = 1024 # adjust to best fit the size of your matching regex
def file_overlapping_chunks filename
  Enumerator.new do |yielder|
    pos = 0
    while pos < File.size(filename)
      data = File.open(filename,'r') { |f| f.seek(pos); f.read(CHUNK_SIZE) }
      yielder.yield(data)
      pos += (CHUNK_SIZE / 2) # adjust to best fit size of your matching regex
    end
  end
end

chunker = file_overlapping_chunks('my_big_file')
chunker.find { |chunk| chunk =~ /xyz/ }

列挙子を使用すると、ファイルの一部を遅延読み込みできます。ファイル チャンクは重複しているため、一致するデータがチャンクの境界に落ちて見落とされることはありません。私が(ずさんに)実装したため、ファイルは開いたままにされないため、使用するために open() または close() は必要ありません。これも最速の方法ではありませんが、使い方は簡単です。ファイル名を指定して呼び出し、提供された列挙子を使用するだけです。

于 2012-08-20T21:33:30.723 に答える