Как загрузить текстовый файл в какую-то табличную переменную в Lua?
Вопрос
Мне нужно загрузить файл в переменные Lua.
Допустим, у меня есть
name address email
Между каждым из них есть пространство.Мне нужно, чтобы текстовый файл, содержащий x-много таких строк, был загружен в какой-нибудь объект - или, по крайней мере, одна строка должна быть сокращена до массива строк, разделенных пробелами.
Возможна ли такого рода работа в Lua и как я должен это сделать?Я довольно новичок в Lua, но я не смог найти ничего подходящего в Интернете.
Решение
Чтобы подробнее остановиться на ответе урока:
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
Однако это не распространяется на случай, если в ваших именах есть пробелы.
Другие советы
Вы хотите прочитать о Lua Шаблоны, которые являются частью библиотека строк.Вот пример функции (не тестировался):
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
Эта функция просто захватывает три подстроки , состоящие из непрост (%S
) персонажи.Реальная функция будет иметь некоторую проверку на ошибки, чтобы убедиться, что шаблон действительно совпадает.
Если у вас есть контроль над форматом входного файла, вам будет лучше хранить данные в формате Lua, как описано здесь.
Если нет, используйте библиотека ввода - вывода чтобы открыть файл, а затем использовать библиотека строк Нравится:
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