2009-12-11 6 views
5

Ich muss Datei zu Lua Variablen laden.Wie lade ich eine Textdatei in eine tabellenartige Variable in Lua?

Sagen wir, ich habe

name address email 

Es gibt Raum zwischen den einzelnen. Ich brauche die Textdatei, in der x-viele solcher Zeilen in irgendeine Art von Objekt geladen werden - oder zumindest die eine Zeile soll in ein Array von Strings geteilt durch Leerzeichen geschnitten werden.

Ist diese Art von Arbeit in Lua möglich und wie soll ich das tun? Ich bin ziemlich neu in Lua, aber ich konnte nichts Relevantes im Internet finden.

+3

Hinweis: der Name der Sprache ist kein Akronym, es ist ein Eigenname (portugiesisch für Mond), also Lua nicht LUA. – RCIX

Antwort

8

Um auf uroc Antwort zu erweitern:

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 

jedoch Dies wird den Fall nicht decken, dass Deine Namen haben Leerzeichen in ihnen.

3

Wenn Sie das Format der Eingabedatei kontrollieren, werden Sie besser die Daten im Lua-Format speichern, wie beschrieben here.

Wenn nicht, verwenden Sie die io library die Datei zu öffnen und dann den string library wie verwenden:

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

Sie möchten über Lua patterns lesen, die Teil der string library sind. Hier ist ein Beispiel-Funktion (nicht getestet):

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 

Diese Funktion nur packt drei Teil bestehend aus nach Leerzeichen (%S) Zeichen. Eine echte Funktion würde eine Fehlerprüfung haben, um sicherzustellen, dass das Muster tatsächlich übereinstimmt.

Verwandte Themen