2009-12-11 12 views
5

Ho bisogno di caricare il file sulle variabili di Lua.Come caricare il file di testo in una sorta di variabile simile a una tabella in Lua?

Diciamo che ho avuto

name address email 

C'è spazio tra ogni. Ho bisogno del file di testo che ha x-many di tali righe in esso per essere caricato in un qualche tipo di oggetto - o almeno la linea deve essere tagliata alla matrice di stringhe divisa per spazi.

Questo tipo di lavoro è possibile a Lua e come dovrei farlo? Sono abbastanza nuovo a Lua ma non ho trovato nulla di rilevante su Internet.

+3

Nota: il nome della lingua non è un acronimo, è un nome proprio (portugese per la luna), quindi Lua non LUA. – RCIX

risposta

8

Per espandere sulla risposta 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 

Questo, tuttavia, non copre il caso che i tuoi nomi hanno spazi in loro.

3

Se si ha il controllo sul formato del file di input, sarà meglio memorizzare i dati nel formato Lua come descritto here.

In caso contrario, utilizzare il io library per aprire il file e quindi utilizzare il string library come:

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

Si desidera leggere circa Lua patterns, che fanno parte del string library. Ecco un esempio di funzione (non testato):

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 

questa funzione è sufficiente afferra tre stringhe composte da non-spazio (%S) caratteri. Una vera funzione avrebbe qualche controllo degli errori per assicurarsi che il modello corrisponda effettivamente.

Problemi correlati