Cómo encontrar una palabra desde el final del archivo en Lua

Ok, uso el método de aquí: ¿Cómo leer solo la última línea de un archivo de texto en Lua?

El problema es que a veces la línea puede ser más grande.

La pregunta es ¿cómo puedo encontrar la primera palabra "foo" desde el final del archivo y luego usar todo lo que sigue?

preguntado el 22 de mayo de 12 a las 19:05

2 Respuestas

El problema es que a veces la línea puede ser más grande.

Entonces solo necesitas buscar más atrás desde el final.

La pregunta es ¿cómo puedo encontrar la primera palabra "foo" desde el final del archivo y luego usar todo lo que sigue?

Tome una parte lo suficientemente grande del archivo para asegurarse de que tiene el último foo, el uso .*foo para omitir todo hasta el último "foo" incluido (.* es codicioso).

local f = io.open('filename', 'r')
f:seek('end', -1024)
local text = f:read('*a')
local after = string.match(text, ".*foo(.*)")
f:close()

contestado el 22 de mayo de 12 a las 20:05

Muchas gracias, esto ayudó mucho. - totalmente atascado

Si el archivo no es demasiado grande y está listo para tomar el camino más fácil, esto podría ayudar:

fh=io.open('myfile.txt','rb')
str=fh:read'*a'
pat='foo'
afterFoo=str:match('.*'..pat..'(.*)$')
fh:close()

Si necesita una solución más compleja, pero más rápida (en tiempo de ejecución en archivos grandes), supongo que leerá el archivo en fragmentos, invertirá cada uno de ellos y buscará su patrón al revés. No olvide buscar su patrón a lo largo de los bordes (los fragmentos deben superponerse al menos a la longitud del patrón que está buscando en el caso general).

Para obtener más explicaciones sobre la lectura del bloque, consulte mi publicación. aquí.

contestado el 23 de mayo de 17 a las 13:05

Gracias también, mi archivo puede ser muy grande (estoy analizando un registro). - totalmente atascado

Dado que ya está utilizando una expresión regular, no es necesario invertir nada. Solo usa .*PATTERN para omitir todo hasta e incluyendo la última aparición de PATTERN. - Barro

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.