我有一个文件数据库。在该文件中,我有类似的内容:
DB_A = ...
DB_B = ...
.
.
.
DB_N = ...
我想解析数据并将它们按如下所示的lua代码分组:
data={}
-- the result after parsing a file
data={
["DB_A"] = {...},
["DB_B"] = {...},
.
.
.
["DB_N"] = {...}
}
换句话说,是否可以在表内部动态创建表并将键分配给每个表,而无需事先知道键的名称是什么(这是我从数据库中解析数据后可以弄清楚的东西)。
(请注意,我使用的是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)
在文件顶部声明的变量PATTERN
是string.match
要使用的捕获模式。如果您不熟悉Lua的模式匹配如何工作,则此模式将查找一系列非空格字符,其右边为零或一个空格,等号,另一个空格,然后是另一系列非空格字符。这两个非空格字符系列是key
和value
这两个匹配项,它们由函数string.match
中的make_table_from_file
返回。
函数eprintf
和printf
是我的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
开始使用数字索引而不是字符串或其他数据类型作为键的表。