Сохранение/чтение таблицы Lua в/из файла
Как грамотно реализовать сохранение таблицы Lua в файл и как прочитать данные из файла обратно в таблицу.
Супер универсальность не нужна и лучше без внешних зависимостей (буду вставлять в LuaLaTeX). Подойдет пример под мою таблицу из примера tquest .
Пробовал разные примеры, например, это: http://lua-users.org/wiki/SaveTableToFile .
Не работает. В файле 5 записей, а у меня их 4! Возможно я что-то не так сделал.
return {
-- Table: {1}
{
{2},
{3},
{4},
{5},
},
-- Table: {2}
{
"{=1}~Коммутативность",
"{=2}~Ассоциативность бинарных операций",
"{=3}~Идемпотентность унарных операций",
"{=4}~Дистрибутивность бинарных операций между бинарными",
"{=5}~Факторизация унарных операций",
["q"]="Какое из свойств \\textbf{реляционной алгебры} представлено далее?\\par \\begin{equation*} \\begin{aligned}U(U(R, S), T) &\\rightarrow U(R, U(S, T)) \\\\ CP(CP(R, S), T) &\\rightarrow CP(R, CP(S, T)) \\\\ J_{F_2}(J_{F_1}(R, S), T)&\\rightarrow J_{F_1}(R, J_{F_2}(S, T)) \\end{aligned} \\end{equation*}",
["a"]=2,
},
-- Table: {3}
{
"{=1}~Свойство стилевого оформления и его значение",
"{=2}~Пространство имен",
"{=3}~Префикс пространства имен",
"{=4}~Название атрибута и его значение",
["q"]="Что должно быть на изображении ниже за знаками вопроса?\\par\\begin{center} \\includegraphics[width=0.7\\linewidth]{xml_v_bd_test_fig_1.pdf}\\end{center}",
["a"]=4,
},
-- Table: {4}
{
"{=1}~Процедура \\textbf{БД}, автоматически вызываемая \\textbf{SQL}~-- сервером при обновлении, удалении или добавлении новой записи в таблицах \\textbf{БД}",
"{=2}~Процедура \\textbf{БД}, вручную вызываемая \\textbf{SQL}~-- сервером при обновлении, удалении или добавлении новой записи в таблицах \\textbf{БД}",
"{=3}~Модуль, написанный на любом языке, который выполняет групповое изменение данных в \\textbf{БД}",
"{=4}~Модуль, написанный на процедурном языке и хранящийся в \\textbf{БД} как метаданные, который можно вызывать из программы",
["q"]="Триггер это \\ldots~?",
["a"]=1,
},
-- Table: {5}
{
"{=1}~xmlns",
"{=2}~xhtml",
"{=3}~xmlds",
"{=4}~xslns",
["q"]="С помощью какого тега в \\textbf{XML} объявляют пространства имен?",
["a"]=1,
},
}
Мой пример:
local function createtbl()
tbl=tbl or {}
table.insert(tbl, {q="Какое из свойств \\textbf{реляционной алгебры} представлено далее?\\par \\begin{equation*} \\begin{aligned}U(U(R, S), T) &\\rightarrow U(R, U(S, T)) \\\\ CP(CP(R, S), T) &\\rightarrow CP(R, CP(S, T)) \\\\ J_{F_2}(J_{F_1}(R, S), T)&\\rightarrow J_{F_1}(R, J_{F_2}(S, T)) \\end{aligned} \\end{equation*}",
a=2,
[1]="{=1}~Коммутативность",
[2]="{=2}~Ассоциативность бинарных операций",
[3]="{=3}~Идемпотентность унарных операций",
[4]="{=4}~Дистрибутивность бинарных операций между бинарными",
[5]="{=5}~Факторизация унарных операций"
})
table.insert(tbl, {q="Что должно быть на изображении ниже за знаками вопроса?\\par\\begin{center} \\includegraphics[width=0.7\\linewidth]{xml_v_bd_test_fig_1.pdf}\\end{center}",
a=4,
[1]="{=1}~Свойство стилевого оформления и его значение",
[2]="{=2}~Пространство имен",
[3]="{=3}~Префикс пространства имен",
[4]="{=4}~Название атрибута и его значение"
})
table.insert(tbl, {q="Триггер это \\ldots~?",
a=1,
[1]="{=1}~Процедура \\textbf{БД}, автоматически вызываемая \\textbf{SQL}~-- сервером при обновлении, удалении или добавлении новой записи в таблицах \\textbf{БД}",
[2]="{=2}~Процедура \\textbf{БД}, вручную вызываемая \\textbf{SQL}~-- сервером при обновлении, удалении или добавлении новой записи в таблицах \\textbf{БД}",
[3]="{=3}~Модуль, написанный на любом языке, который выполняет групповое изменение данных в \\textbf{БД}",
[4]="{=4}~Модуль, написанный на процедурном языке и хранящийся в \\textbf{БД} как метаданные, который можно вызывать из программы"
})
table.insert(tbl, {q="С помощью какого тега в \\textbf{XML} объявляют пространства имен?",
a=1,
[1]="{=1}~xmlns",
[2]="{=2}~xhtml",
[3]="{=3}~xmlds",
[4]="{=4}~xslns"
})
return tbl
end
-- функция печати таблицы
local function printall(arr)
local ans = "["
for i,n in ipairs(tbl) do
ans = ans .. n.a .. ","
print("[" .. i .. "] " .. n.q .. "\n")
for j = 1, #n do
local s = " [" .. j .. "] " .. n[j]
print(s)
end
print("\n")
end
ans = ans:sub(1, ans:len()-1) .. "]"
print("answer" .. ans)
end
print ("create table with questions");
local tquest = createtbl();
print ("\n" .. "######################################################");
printall(tquest);
print ("######################################################" .. "\n");
--print ("save table into file");
--table.save(tquest, "tquest.txt");
--print ("load table from file");
--local t2,err = table.load( "tquest.txt" );
--print ("print table t2");
--print ("\n" .. "######################################################");
--printall(t2);
--print ("######################################################" .. "\n");
Заранее спасибо.
Ответы (1 шт):
Автор решения: Mike V.
→ Ссылка
ну вот так примерно будет работать:
local function createtbl()
local tbl = {}
table.insert(tbl, {q="Какое из свойств \\textbf{реляционной алгебры} представлено далее?\\par \\begin{equation*} \\begin{aligned}U(U(R, S), T) &\\rightarrow U(R, U(S, T)) \\\\ CP(CP(R, S), T) &\\rightarrow CP(R, CP(S, T)) \\\\ J_{F_2}(J_{F_1}(R, S), T)&\\rightarrow J_{F_1}(R, J_{F_2}(S, T)) \\end{aligned} \\end{equation*}",
a=2,
[1]="{=1}~Коммутативность",
[2]="{=2}~Ассоциативность бинарных операций",
[3]="{=3}~Идемпотентность унарных операций",
[4]="{=4}~Дистрибутивность бинарных операций между бинарными",
[5]="{=5}~Факторизация унарных операций"
})
table.insert(tbl, {q="Что должно быть на изображении ниже за знаками вопроса?\\par\\begin{center} \\includegraphics[width=0.7\\linewidth]{xml_v_bd_test_fig_1.pdf}\\end{center}",
a=4,
[1]="{=1}~Свойство стилевого оформления и его значение",
[2]="{=2}~Пространство имен",
[3]="{=3}~Префикс пространства имен",
[4]="{=4}~Название атрибута и его значение"
})
table.insert(tbl, {q="Триггер это \\ldots~?",
a=1,
[1]="{=1}~Процедура \\textbf{БД}, автоматически вызываемая \\textbf{SQL}~-- сервером при обновлении, удалении или добавлении новой записи в таблицах \\textbf{БД}",
[2]="{=2}~Процедура \\textbf{БД}, вручную вызываемая \\textbf{SQL}~-- сервером при обновлении, удалении или добавлении новой записи в таблицах \\textbf{БД}",
[3]="{=3}~Модуль, написанный на любом языке, который выполняет групповое изменение данных в \\textbf{БД}",
[4]="{=4}~Модуль, написанный на процедурном языке и хранящийся в \\textbf{БД} как метаданные, который можно вызывать из программы"
})
table.insert(tbl, {q="С помощью какого тега в \\textbf{XML} объявляют пространства имен?",
a=1,
[1]="{=1}~xmlns",
[2]="{=2}~xhtml",
[3]="{=3}~xmlds",
[4]="{=4}~xslns"
})
return tbl
end
-- функция печати таблицы
local function printall(arr)
local ans = "["
for i,n in ipairs(arr) do -- ? тут была tbl
ans = ans .. n.a .. ","
print("[" .. i .. "] " .. n.q .. "\n")
for j = 1, #n do
local s = " [" .. j .. "] " .. n[j]
print(s)
end
print("\n")
end
ans = ans:sub(1, ans:len()-1) .. "]"
print("answer" .. ans)
end
print ("== 1 ==");
local tquest = createtbl();
--===========
local function TableToText(tt, level)
level = (level or 0) + 1
local rep = string.rep("\t",level)
if type(tt) == 'table' then
local s = '\n' .. rep .. '{ \n'
for k,v in pairs(tt) do
if type(k) ~= 'number' then k = '"'..k..'"' end
local tmp = TableToText(v, level)
if type(v) == 'string' then tmp = '"' .. tmp .. '"' end
s = s .. rep .. '['..k..'] = ' .. tmp .. ',\n'
end
return s .. rep ..'}'
else
return tostring(tt)
end
end
local filename = 'D:\\lua_data.lua'
local h = io.open (filename , "w+b")
if h==nil then print("error file create") return end
local str = TableToText(tquest)
str = "return " .. str .. '\n'
h:write( str)
h:close()
--===========
print ("== 2 ==");
local table_restored = dofile(filename)
print ("== 3 ==");
printall(table_restored)