возврат смещения строки с lua - PullRequest
1 голос
/ 18 января 2012

Я пытаюсь найти довольно большие файлы по определенной строке и вернуть ее смещение. Я новичок в lua, и мой текущий подход будет выглядеть так:

linenumber = 0
for line in io.lines(filepath) do
result=string.find(line,"ABC",1)
linenumber = linenumber+1

if result ~= nil then
offset=linenumber*4096+result
io.close
end
end

Я понимаю, что этот путь довольно примитивен и, конечно, медленен. Как я могу сделать это более эффективно?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Если файл не слишком большой, и вы можете сэкономить память, быстрее всего просто наброситься на весь файл и просто использовать 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

Если ваш файл действительно имеет строки, вы такжеиспользуйте объясненный трюк здесь . В этом разделе в книге Программирование на Lua объясняются некоторые соображения производительности при чтении файлов.

1 голос
/ 18 января 2012

Если ваши строки не имеют одинаковой длины (4096), я не вижу, как ваш код может работать.

Вместо использования io.lines, читайте блоки с io.read(4096).Остальная часть вашего кода может использоваться как есть, за исключением того, что вам нужно обрабатывать случай, когда ваша строка не полностью внутри блока.Если файлы состоят из строк, то уловка, упомянутая в Программировании на Lua, заключается в том, чтобы сделать io.read(4096,"*l"), чтобы прочитать блоки, заканчивающиеся на границах строк.Тогда вам не нужно беспокоиться о строках, которые не полностью находятся внутри блока, но вам нужно настроить расчет смещения так, чтобы он включал длину блока, а не только 4096.

...