2016-03-28 8 views
0

So konnte ich Daten aus einer Datei in eine Tabelle schreiben und das erste Wort jeder Zeile einen Schlüssel setzen. Wie zeige ich was in der Tabelle in einer Reihenfolge an, basierend auf dem Lesen in einer anderen Datei mit nur den Schlüsseln?Anzeige der Tabelleninformationen basierend auf einer eingelesenen Datei

-- see if the file exists 
function file_exists(file) 
    local f = io.open("data.txt", "rb") 
    if f then f:close() end 
    return f ~= nil 
end 

-- get all lines from a file, returns an empty 
-- list/table if the file does not exist 
function lines_from(file) 
    if not file_exists(file) then return {} end 
    lines = {} 
    for line in io.lines("data.txt") do 
    first_word = string.gmatch(line, "%a+") -- word 
    lines[first_word] = line 
    end 
    return lines 
end 

local lines = lines_from(file) 

end 

Antwort

0

Sie haben einige Fehler im Code:

-- see if the file exists 
function file_exists(file) 
    local f = io.open(file, "rb") -- <-- changed "data.txt" to file 
    if f then f:close() end 
    return f ~= nil 
end 

-- get all lines from a file, returns an empty 
-- list/table if the file does not exist 
function lines_from(file) 
    if not file_exists(file) then return {} end 
    lines = {} 
    for line in io.lines(file) do -- <-- changed "data.txt" to file 
     first_word = string.match(line, "%a+") -- <-- changed gmatch to match (IMPORTANT) 
     lines[first_word] = line 
    end 
    return lines 
end 

local lines = lines_from(file) 

ich das letzte Ende entfernt, da es keinen Block brachte. Die zu passierende Änderung gmatch ist kritisch, da gmatch einen Iterator, eine Funktion zurückgibt.

Zu Ihrer Frage: die Schlüsseldatei lesen, aber die Einträge in einer Array Weise speichern:

function key_file(file) 
    if not file_exists(file) then return {} end 
    keys = {} 
    for line in io.lines(file) do 
     key = string.match(line, "%a+") 
     table.insert(keys, key) 
    end 
    return keys 
end 

In einem anderen Ort, den Sie über das Tastenfeld durchlaufen, die Schlüssel für die Linien Tabelle:

local lines = lines_from("data.txt") 
local keys = key_file("keys.txt") 

for i, key in ipairs(keys) do 
    print(string.format("%d: %s", i, lines[key])) 
end 
+0

Muss ich beibehalten, wo Sie Datei als data.txt sagte? Wenn ich es mache Datei gibt es mir Fehler – CorDell

+0

Wie füge ich Zeile 1 vor dem ersten output und so weiter? – CorDell

+0

@CorDell: Da Sie Funktionen verwenden i angenommen Sie sie in einer Art und Weise, wie diese riefen: 'lines_from („data.txt“)' (wie Sie in meinem letzten Codebeispiel sehen) Lua nicht, wenn Sie sich beschweren tun Sie das nicht, aber dann wird es einen Nullwert für den Dateinamen erhalten, und das wird nicht funktionieren. Also müssen Sie den Dateinamen an lua übergeben. In Ihrem Beispiel ist der erste Dateiname "data.txt", für die Schlüsseldatei habe ich nur "keys.txt" genommen. Aber Sie müssen das sicherlich zu Ihrem Fall übernehmen. Für Ihren zweiten Kommentar: Verwenden Sie print zusammen mit string.format. Ich habe meine Antwort bearbeitet, um dies zu erreichen. – pschulz

Verwandte Themen