如果文件不是太大,你可以备用内存,只需要在整个文件中使用,只需使用string.find
即可。如果不是,您可以按块搜索文件。
你的做法是不是所有的坏。我建议加载文件在重叠块中。重叠避免了模式只是块之间的分裂,会被忽视,如:
".... ...A BC.. ...."
我的实现是这样的:
size=4096 -- note, size should be bigger than the length of pat to work.
pat="ABC"
overlap=#pat
fh=io.open(filepath,'rb') -- On windows, do NOT forget the b
block=fh:read(size+overlap)
n=0
while block do
block_offset=block:find(pat)
if block_offset then
print(block_offset)
offset=block_offset+size*n
break
end
fh:seek('cur',-overlap)
cur=fh:seek'cur'
block=fh:read(size+overlap)
n=n+1
end
if offset then
print('found pattern at', offset, 'after reading',n,'blocks')
else
print('did not find pattern')
end
如果你的文件确实有行,你也可以使用的伎俩解释here。在Lua中的编程中的This section解释了读取文件的一些性能考虑事项。
非常感谢您的示例!它像一个魅力。我按照第21.1节的方式工作。在发布我的问题之前,lua代码书的内容,但我错过了21.2.1,所以感谢提示! 我还不熟悉“#” - 符号的概念。显然你使用它来创建重叠,但是在lua代码簿中是否有一个部分详细解释了它的用法以及其重叠大小等功能? – Zerobinary99 2012-01-18 11:55:18
感谢您用实际的代码丰富我的答案。 – lhf 2012-01-18 14:52:51
'#'操作符只是返回字符串的长度,作为序列的表(键是1到n,没有孔)或定义__len元方法的对象。请注意,字符串的长度是*字节数*,它不一定等于字符数(认为UTF-8等)。 – jpjacobs 2012-01-19 08:20:56