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

问题描述 投票:1回答:1

我有一个文件数据库。在该文件中,我有类似的内容:

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

我想解析数据并将它们按如下所示的lua代码分组:

data={}

-- the result after parsing a file
 data={
    ["DB_A"] = {...},
    ["DB_B"] = {...},
    .
    .
    .
    ["DB_N"] = {...}
 }

换句话说,是否可以在表内部动态创建表并将键分配给每个表,而无需事先知道键的名称是什么(这是我从数据库中解析数据后可以弄清楚的东西)。

lua
1个回答
1
投票

(请注意,我使用的是Lua 5.3.5;此外,我很抱歉我的代码比Lua更像C!)

逐行遍历输入文件-可以使用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("Filename expected from command line\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)

在文件顶部声明的变量PATTERNstring.match要使用的捕获模式。如果您不熟悉Lua的模式匹配如何工作,则此模式将查找一系列非空格字符,其右边为零或一个空格,等号,另一个空格,然后是另一系列非空格字符。这两个非空格字符系列是keyvalue这两个匹配项,它们由函数string.match中的make_table_from_file返回。

函数eprintfprintf是我的Lua版本的C样式格式的输出函数。前者在Lua中写入标准错误io.stderr。然后后者写入标准输出Lua中的io.stdout

在您的问题中,您提供了预期输出的示例。在表data中,您希望它包含与表相对应的键作为值。根据您提供的示例输入文本,我假设这些表中包含的数据是输入文件中等号右边的所有内容-用...表示。由于我不知道这些...的确切含义,因此我无法为您提供一个可靠的示例,说明如何将右侧数据分离到表中。根据您要执行的操作,可以使用string.match返回的第二个变量(我称为value),并使用Lua的字符串模式匹配将其进一步分离。它可能看起来像这样:

...
local function make_table_from_value(val)
    // Split `val` into distinct elements to form a table with `some_pattern`
    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开始使用数字索引而不是字符串或其他数据类型作为键的表。

© www.soinside.com 2019 - 2024. All rights reserved.