Перейти к содержимому
1Ridav

Библиотека Preferences сохранения данных в файлах

Рекомендуемые сообщения

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(таблица с данными)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация.

 

Плюсы по сравнению с оригиналом:

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.

Изменено пользователем FredoNook

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Понадобилось нечто подобное, человеческого ини парсера найти не удалось, посмотрел эту либу немного переписал. Возможно кому-то больше понравится моя реализация.

 

Плюсы по сравнению с оригиналом:

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: Поднял твое сообщение, чтобы было видно всем

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...