2009-12-11 8 views
5

Necesito cargar el archivo a las variables de Lua.¿Cómo cargar el archivo de texto en una especie de variable similar a una tabla en Lua?

Digamos que tengo

name address email 

Hay un espacio entre cada uno. Necesito el archivo de texto que tiene x-muchas de esas líneas para cargar en algún tipo de objeto, o al menos una línea se cortará en una matriz de cadenas divididas por espacios.

¿Es posible este tipo de trabajo en Lua y cómo debería hacerlo? Soy bastante nuevo para Lua pero no pude encontrar nada relevante en Internet.

+3

Nota: el nombre del idioma no es un acrónimo, es un nombre propio (en portugués para la luna), por lo que Lua no es LUA. – RCIX

Respuesta

8

Para ampliar la respuesta de UROC:

local file = io.open("filename.txt") 
if file then 
    for line in file:lines() do 
     local name, address, email = unpack(line:split(" ")) --unpack turns a table like the one given (if you use the recommended version) into a bunch of separate variables 
     --do something with that data 
    end 
else 
end 
--you'll need a split method, i recommend the python-like version at http://lua-users.org/wiki/SplitJoin 
--not providing here because of possible license issues 

Sin embargo, esto no va a cubrir el caso de que tus nombres tienen espacios en ellos.

3

Si tiene control sobre el formato del archivo de entrada, será mejor que guarde los datos en formato Lua como se describe en here.

Si no es así, utilice el io library para abrir el archivo y luego usar el string library como:

local f = io.open("foo.txt") 
while 1 do 
    local l = f:read() 
    if not l then break end 
    print(l) -- use the string library to split the string 
end 
11

Quiere leer sobre Lua patterns, que son parte de string library. He aquí un ejemplo de función (no probado):

function read_addresses(filename) 
    local database = { } 
    for l in io.lines(filename) do 
    local n, a, e = l:match '(%S+)%s+(%S+)%s+(%S+)' 
    table.insert(database, { name = n, address = a, email = e }) 
    end 
    return database 
end 

Esta función simplemente agarra tres subseries compuestos de no-espacio (%S) caracteres. Una función real tendría algún error de verificación para asegurarse de que el patrón realmente coincida.

Cuestiones relacionadas