有没有办法将Ruby模式与文件内容进行匹配,只需加载尽可能多的文件来匹配模式?
例如,给定模式
p = /(abc)*/
和包含内容的文件f
abcabcdefdef
有没有办法在没有从磁盘读取文件的最后三个字母(“def”)的情况下将p与f的内容进行匹配?基本上,我希望只根据需要加载一个大文件,同时仍然能够将模式与文件的任意长部分进行匹配。
答案 0 :(得分:1)
使用枚举器延迟加载文件的块:
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()来使用它。这也不是最快的方法,但它很容易使用 - 只需使用文件名调用并使用提供的枚举器。