如何让 LUA 脚本读取我的配置文件

我想让 LUA 脚本读取自定义配置文件

personal.txt

[user4]
id=1234
code=9876

[user3]
id=765
code=fh723

这样我就可以读取或写入数据了。

点赞
用户868247
用户868247

为此,您应该将配置文件制作成Lua兼容格式:

- personal.txt

user4 = {
  id=1234,
  code=9876,
}

user3 = {
  id=765,
  code=fh723,
}

然后,您可以使用loadfile加载文件,并传入自定义环境以将内容放置其中:

local configEnv = {} -- 以保持与全局环境分离
local f,err = loadfile("personal.txt", "t", configEnv)
if f then
   f() -- 运行块
   -- 现在configEnv应该包含您的数据
   print(configEnv.user4) -- 表
else
   print(err)
end

当然,有多种方法可以做到这一点,这只是一种简单且相对安全的方法。

2016-12-16 03:28:15
用户4473079
用户4473079

你可以使用 Lua 模块来制作你的配置文件:

-- config.lua

local _M = {}

_M.user3 = {
    id = 765,
    code = "fh723",
}

_M.user4 = {
    id = 1234,
    code = "9876",
}

return _M

然后你可以 require 这个模块,并随心所欲地使用模块表中的字段:

-- main.lua

local config = require "config"

print (config.user3.id)
print (config.user3.code)

print (config.user4.id)
print (config.user4.code)

-- 你也可以修改模块表中的字段
config.user4.id = 12345
print (config.user4.id)

输出:

765

fh723

1234

9876

12345

2016-12-16 03:44:21
用户3735873
用户3735873

下面是一种可能性。(警告:未经 100% 测试但似乎有效。) 您可以读取/写入此类文件,并根据哪些参数留空添加,更新或删除条目。

--==============================================================================

本地
功能文件_exists(path)
  当地f = io.open(path)
  如果f == nil then return end
  f:close()
  返回路径
以下 

- 在一个表格中读取整个配置,使每个部分成为具有相应对中对的键的键/值对表的键。

功能read_config(filename)
  文件名 =文件名或''
  断言类型(文件名)=='字符串')
  如果文件_exists (文件名)~= nil then return ans endlocal ans,u,k,v,temp = {}
  的为了line 进入 io.lines(文件名)中
    temp = line:match'^%[(.+)%]$')
    如果 temp ~ = nil 而且 u ~ = temp 那么 u = temp end
    k,v = line:match'^([^ =] +)=(.+)$')
    如果 u ~ = nil then
      ans [u] = ans [u]或{}
      如果 k ~ = nil then
        ans [u] [k] = v
      结束
    结束
  返回答案
结束

- 当三个参数都为空时,根本不采取任何措施。
- 当键和值都为空,但部分不为空时,删除部分。
- 仅当值为空时,删除给定部分的键值对。

功能write_config(filename,section,key,value)
  文件名 =文件名或''
  断言类型(文件名)=='字符串')
  如果section == nil且key == nil且value == nil then return end
  t = read_config (文件名)       - 读取现有配置(如果有)

  如果部分~ = nil且值== nil then
    如果关键字== nil,则t [section] = nil --消除整个部分
    其他
      t [section] [key] = nil - 消除键/值对
    结束
    转到WriteFile
  结束

  如果关键字:match'=' then
    错误('关键字内部不应包含等号')
  结束

  t [部分] = t [部分]或{} - 如果不存在则创建部分
  t [section] [key] = value - 更新关键值

  WriteFile: - 写入文件
  fo = io打开(文件名,'w')
  对于k,v在对中对(t)中对
    fo:write('['..k..']\n')
    对于k,v在对中对(v)中对
      fo:write(k..'='..v..'\n')
    结束
    fo:write('\n')
  结束
  fo:close()

  返程-返回更新的配置表
结束

-==============================================================================

示例用法的
--------------------------------------------------------------------------------

f ='personal.txt' - 要使用的文件

write_config(f,'user2''id''my_id') - 更新关键字值对
write_config(f,'user2''name''noone') - 添加关键字值对
write_config(f,'user3''id''818') - 更新关键字值对
write_config(f,'user3''xxx''whatever') - 添加关键字值对
write_config(f,'newuser''id''54321') - 创建新用户
write_config(f,'newuser''xxx''54321') - 创建新关键字/值对
write_config(f,'newuser''xxx') - 删除关键值对
write_config(f,'newuser') - 删除部分
2016-12-17 19:16:41