如何在lua中使用类似字符串的键创建变长的表格
2019-12-4 19:27:50
收藏:0
阅读:136
评论:1
我有一个文件数据库。在该文件中,我有如下内容:
DB_A = ...
DB_B = ...
.
.
.
DB_N = ...
我想解析这些数据并在lua代码中组合它们,如下所示:
data={}
--解析文件后的结果
data={
["DB_A"] = {...},
["DB_B"] = {...},
.
.
.
["DB_N"] = {...}
}
换句话说,是否可以动态地在一个表格内创建另一个表格,并为每个表格分配键,而不必预先知道键的名称(在从数据库解析数据之后,我可以弄清楚这一点)。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

通过一行一行迭代输入文件,可以使用Lua的
FILE*的lines方法,使用string.match从每行获取所需信息。#!/usr/bin/lua local PATTERN = "(%S+)%s?=%s?(%S+)" local function eprintf(fmt, ...) io.stderr:write(string.format(fmt, ...)) return end local function printf(fmt, ...) io.stdout:write(string.format(fmt, ...)) return end local function make_table_from_file(filename) local input = assert(io.open(filename, "r")) local data = {} for line in input:lines() do local key, value = string.match(line, PATTERN) data[key] = value end return data end local function main(argc, argv) if (argc < 1) then eprintf("命令行中需要输入文件名\n") os.exit(1) end local data = make_table_from_file(argv[1]) for k, v in pairs(data) do printf("data[%s] = %s\n", k, data[k]) end return 0 end main(#arg, arg)在文件顶部声明的变量
PATTERN是您要使用string.match的捕获模式。如果您对Lua的模式匹配不熟悉,此模式查找具有零个或一个空格的一系列非空格字符,等号,另一个空格,然后是另一系列非空格字符。两个非空格字符系列是string.match在make_table_from_file函数中返回的两个匹配-key和value。函数
eprintf和printf是我基于C风格的格式化输出函数的Lua版本。前者写入标准错误,在Lua中是io.stderr,后者写入标准输出,在Lua中是io.stdout。在您的问题中,您给出了期望输出的示例。在
data表中,您希望它包含对应值的表键。根据您提供的示例输入文本,我假设这些表中包含的数据是等于符号右侧的任何内容-您用...表示。由于我不知道这些...具体代表什么,所以无法为将右侧数据分离为表提供坚实的示例。根据您的需求,可以取string.match返回的第二个变量(我称之为value),并使用Lua的字符串模式匹配进一步将其分隔。它可能会像这样:... local function make_table_from_value(val) //使用`some_pattern`将`val`拆分为不同的元素,形成一个表 return {string.match(val, some_pattern)} end local function make_table_from_file(filename) local input = assert(io.open(filename, "r")) local data = {} for line in input:lines() do local key, value = string.match(line, PATTERN) data[key] = make_table_from_value(value) end return data end ...在
make_table_from_value中,string.match将返回一些元素,基于您作为第二个参数提供的任何字符串模式,您可以通过将函数调用括在花括号中来使用这些元素创建一个表。它将是一个使用数字索引作为键-而不是字符串或其他数据类型-从1开始的表。