如何在lua中使用类似字符串的键创建变长的表格

我有一个文件数据库。在该文件中,我有如下内容:

DB_A = ...
DB_B = ...
.
.
.
DB_N = ...

我想解析这些数据并在lua代码中组合它们,如下所示:

data={}

--解析文件后的结果
 data={
    ["DB_A"] = {...},
    ["DB_B"] = {...},
    .
    .
    .
    ["DB_N"] = {...}
 }

换句话说,是否可以动态地在一个表格内创建另一个表格,并为每个表格分配键,而不必预先知道键的名称(在从数据库解析数据之后,我可以弄清楚这一点)。

点赞
用户9922866
用户9922866

通过一行一行迭代输入文件,可以使用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.matchmake_table_from_file函数中返回的两个匹配-keyvalue

函数eprintfprintf是我基于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开始的表。

2019-12-05 00:39:06