0

有没有办法将 Ruby 模式与文件的内容进行匹配,只加载与模式匹配所需的文件?

例如,给定模式

p = /(abc)*/

和包含内容的文件 f

abcabcdefdef

有没有办法在不从磁盘读取文件的最后三个字母(“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 回答