1Ridav 1 049 Опубликовано: 3 апреля, 2015 http://pastebin.com/Dp8nc55U pastebin get Dp8nc55U /lib/pref.lua pastebin get Dp8nc55U pref.lua В свободное время написал такую вот библу для более удобного хранения структурированных данных в файлах.К примеру часто видел, что в файлах стоит такая вот причуда: Bob Marley 34 Trololo street Если из слов еще можно понять, что хранится на строке, то с цифрами это сложнее: 11 1 true 3 Более простой способ привести это в понятный вид - использовать параметризацию.Файл будет выглядеть так: name=Bob surname=Marley age=34 address=Trololo street Вот и библа. Ссылка на пастбин сверху. Создаем новый файл с данными: local pref = require("pref") --так же можно использовать local pref = dofile("pref.lua") для загрузки из текущей папки, а не из папки lib local table = pref.create("newPrefFilePath") --к примеру новый файл "bob" table["name"] = "Bob" table["surname"] = "Marley" table["age"] = 34 table["address"] = "Trololo street" pref.save(table) -- мы внесли изменения в таблицу, их надо сохранить. Если изменений не вносилось - можно не сохранять Загружаем существующий файл с данными: local pref = require("pref") --так же можно использовать local pref = dofile("pref.lua") local table = pref.load("newPrefFilePath") --к примеру файл "bob" print(table["name"], table["age"]) --изменений в не производили, так что можно не сохранять table["age"] = 35 table["weight"] = 70 --Добавили новое поле в существующий файл pref.save(table) --изменили возраст, сохраним Функции: pref.create("путь до нового файла данных") pref.load("путь до существующего файла данных") pref.save(таблица с данными) 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
FredoNook 19 Опубликовано: 28 июля, 2015 (изменено) Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация. Плюсы по сравнению с оригиналом: 1. Объектный подход 2. В таблицах не хранятся никакие лишние данные, только непосредственно те что вы там сохранили, вспомогательные данные и методы хранятся в метатаблице 3. Вытекает из второго в файлы не сохраняются пути до них, сохраняются только ваши данные --by 1Ridav, rewritten by FredoNook ---http://computercraft.ru local PWD = os.getenv("PWD") local pref = {} local meta = {} meta.filename = "" meta.table = {} local function load(path) local table = {} local key, value, delimeter local len = 0 local f = io.open(path, "r") if not f then return nil end for line in f:lines() do len = len + 1 delimeter = string.find(line, "=") key = string.sub(line, 1, delimeter-1) value = string.sub(line, delimeter+1, #line) table[key] = value end f:close() if len == 0 then return nil end return table end function meta.__call(op, path) local newmeta = {} for n, v in pairs(meta) do newmeta[n] = v end local table = load(PWD..path) or {} newmeta.table = table newmeta.filename = PWD..path newmeta.__index = newmeta setmetatable(table, newmeta) return table end function meta:save() local f = io.open(self.filename, "w") if not f then return false end for k, v in pairs(self.table) do f:write(k.."="..v.."\n") end f:close() return true end setmetatable(pref, meta) return pref Использование: preferences = pref("filepath") В случае если файл найден открывает его и парсит в переменную preferences, в случае если файл отсутствует создает новую таблицу в preferences. preferences:save() Сохраняет таблицу в файл (по пути который был задан в pref("filename")) Пример: pref = require("pref") // подключаем либу settings = pref("bob.cfg") -- В рабочей директории нет файла bob.cfg поэтому создается новая таблица settings.fname = "Bob" -- Добавляем значения к таблице settings.lname = "Marley" settings.year = 90 settings.status = "Narcoman" settings:save() -- сохраняем таблицу в файл bob.cfg в рабочей директории settings = pref("bob.cfg") -- Открываем файл bob.cfg поскольку он есть в рабочей директории settings.year = 00 -- Меняем значения в загруженной таблице settings.status = "Icon" settings:save() -- Сохраняем таблицу в файл bob.cfg в рабочей директории PS Переписано за пять минут, толком не тестировалось. Возможны ошибки, хотя крайне маловероятны. Feedback welcome. Изменено 28 июля, 2015 пользователем FredoNook 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav Автор темы 1 049 Опубликовано: 28 июля, 2015 Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация. Плюсы по сравнению с оригиналом: 1. Объектный подход 2. В таблицах не хранятся никакие лишние данные, только непосредственно те что вы там сохранили, вспомогательные данные и методы хранятся в метатаблице 3. Вытекает из второго в файлы не сохраняются пути до них, сохраняются только ваши данные --by 1Ridav, rewritten by FredoNook ---http://computercraft.ru local PWD = os.getenv("PWD") local pref = {} local meta = {} meta.filename = "" meta.table = {} local function load(path) local table = {} local key, value, delimeter local len = 0 local f = io.open(path, "r") if not f then return nil end for line in f:lines() do len = len + 1 delimeter = string.find(line, "=") key = string.sub(line, 1, delimeter-1) value = string.sub(line, delimeter+1, #line) table[key] = value end f:close() if len == 0 then return nil end return table end function meta.__call(op, path) local newmeta = {} for n, v in pairs(meta) do newmeta[n] = v end local table = load(PWD..path) or {} newmeta.table = table newmeta.filename = PWD..path newmeta.__index = newmeta setmetatable(table, newmeta) return table end function meta:save() local f = io.open(self.filename, "w") if not f then return false end for k, v in pairs(self.table) do f:write(k.."="..v.."\n") end f:close() return true end setmetatable(pref, meta) return pref Использование: preferences = pref("filepath") В случае если файл найден открывает его и парсит в переменную preferences, в случае если файл отсутствует создает новую таблицу в preferences. preferences:save() Сохраняет таблицу в файл (по пути который был задан в pref("filename")) Пример: pref = require("pref") // подключаем либу settings = pref("bob.cfg") -- В рабочей директории нет файла bob.cfg поэтому создается новая таблица settings.fname = "Bob" -- Добавляем значения к таблице settings.lname = "Marley" settings.year = 90 settings.status = "Narcoman" settings:save() -- сохраняем таблицу в файл bob.cfg в рабочей директории settings = pref("bob.cfg") -- Открываем файл bob.cfg поскольку он есть в рабочей директории settings.year = 00 -- Меняем значения в загруженной таблице settings.status = "Icon" settings:save() -- Сохраняем таблицу в файл bob.cfg в рабочей директории PS Переписано за пять минут, толком не тестировалось. Возможны ошибки, хотя крайне маловероятны. Feedback welcome. Я тоже по началу такой путь выбрал. но потом пока дебажил - вечно путался где у меня префы, а где свои переменные. Сказалось то, что всегда работал с ними через get/set вызовы функций типа set("key", value). Поэтому решил для наглядности использовать табличный вид, они контрастно выделяются на фоне. В принципе большой разницы нет в моем или твоем варианте, это лишь дело вкуса при использовании PS: Поднял твое сообщение, чтобы было видно всем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах