如何解析显示的配置文件以创建所需的 lua table?
How to parse the config file shown to create a lua table that is desired?
我想解析一个包含如下信息的配置文件:
[MY_WINDOW_0]
Address = 0xA0B0C0D0
Size = 0x100
Type = cpu0
[MY_WINDOW_1]
Address = 0xB0C0D0A0
Size = 0x200
Type = cpu0
[MY_WINDOW_2]
Address = 0xC0D0A0B0
Size = 0x100
Type = cpu1
变成LUAtable如下
CPU_TRACE_WINDOWS =
{
["cpu0"] = {{address = 0xA0B0C0D0, size = 0x100},{address = 0xB0C0D0A0, size = 0x200},}
["cpu1"] = {{address = 0xC0D0A0B0, size = 0x100},...}
}
我尽力使用一些基本的 LUA 字符串操作函数,但由于 'Address' 等每个部分中重复的字符串,无法获得我正在寻找的输出,' Size ','Type' 等。我的实际配置文件也很大,有 20 个这样的部分。
到目前为止,这基本上是代码的一部分,其余只是逻辑的重复。
OriginalConfigFile = "test.cfg"
os.execute("cls")
CPU_TRACE_WINDOWS = {}
local bus
for line in io.lines(OriginalConfigFile) do
if string.find(line, "Type") ~= nil then
bus = string.gsub(line, "%a=%a", "")
k,v = string.match(bus, "(%w+) = (%w+)")
table.insert(CPU_TRACE_WINDOWS, v)
end
end
基本上,我在想出我需要的最终 TABLE 结构时遇到了麻烦。 v 这里是字符串 "Type" 的不同右值。我在 table 中遇到问题。我目前正在努力寻找解决方案,但我想我可以同时寻求帮助。
这应该适合你。只需将文件名更改为您存储配置文件的位置即可。
f, Address, Size, Type = io.input("configfile"), "", "", ""
CPU_TRACE_WINDOWS = {}
for line in f:lines() do
if line:find("MY_WINDOW") then
Type = ""
Address = ""
Size = ""
elseif line:find("=") then
_G[line:match("^%a+")] = line:match("[%d%a]+$")
if line:match("Type") then
if not CPU_TRACE_WINDOWS[Type] then
CPU_TRACE_WINDOWS[Type] = {}
end
table.insert(CPU_TRACE_WINDOWS[Type], {address = Address, size = Size})
end
end
end
end
它搜索 MY_WINDOW 短语并重置变量。如果 table 存在于 CPU_TRACE_WINDOWS 中,那么它只是附加一个新的 table 值,否则它只是创建它。请注意,这取决于 Type
始终是最后一个条目。如果它在任何地方切换,那么它就不会拥有所有必需的信息。可能有更简洁的方法来做到这一点,但这有效(在我这边测试过)。
编辑:糟糕,如果 MY_WINDOW 匹配,忘记更改中间的变量。这需要更正。
编辑 2:使用 table.insert 清除冗余。只需要一次,只需要确保先创建table。
我想解析一个包含如下信息的配置文件:
[MY_WINDOW_0]
Address = 0xA0B0C0D0
Size = 0x100
Type = cpu0
[MY_WINDOW_1]
Address = 0xB0C0D0A0
Size = 0x200
Type = cpu0
[MY_WINDOW_2]
Address = 0xC0D0A0B0
Size = 0x100
Type = cpu1
变成LUAtable如下
CPU_TRACE_WINDOWS =
{
["cpu0"] = {{address = 0xA0B0C0D0, size = 0x100},{address = 0xB0C0D0A0, size = 0x200},}
["cpu1"] = {{address = 0xC0D0A0B0, size = 0x100},...}
}
我尽力使用一些基本的 LUA 字符串操作函数,但由于 'Address' 等每个部分中重复的字符串,无法获得我正在寻找的输出,' Size ','Type' 等。我的实际配置文件也很大,有 20 个这样的部分。
到目前为止,这基本上是代码的一部分,其余只是逻辑的重复。
OriginalConfigFile = "test.cfg"
os.execute("cls")
CPU_TRACE_WINDOWS = {}
local bus
for line in io.lines(OriginalConfigFile) do
if string.find(line, "Type") ~= nil then
bus = string.gsub(line, "%a=%a", "")
k,v = string.match(bus, "(%w+) = (%w+)")
table.insert(CPU_TRACE_WINDOWS, v)
end
end
基本上,我在想出我需要的最终 TABLE 结构时遇到了麻烦。 v 这里是字符串 "Type" 的不同右值。我在 table 中遇到问题。我目前正在努力寻找解决方案,但我想我可以同时寻求帮助。
这应该适合你。只需将文件名更改为您存储配置文件的位置即可。
f, Address, Size, Type = io.input("configfile"), "", "", ""
CPU_TRACE_WINDOWS = {}
for line in f:lines() do
if line:find("MY_WINDOW") then
Type = ""
Address = ""
Size = ""
elseif line:find("=") then
_G[line:match("^%a+")] = line:match("[%d%a]+$")
if line:match("Type") then
if not CPU_TRACE_WINDOWS[Type] then
CPU_TRACE_WINDOWS[Type] = {}
end
table.insert(CPU_TRACE_WINDOWS[Type], {address = Address, size = Size})
end
end
end
end
它搜索 MY_WINDOW 短语并重置变量。如果 table 存在于 CPU_TRACE_WINDOWS 中,那么它只是附加一个新的 table 值,否则它只是创建它。请注意,这取决于 Type
始终是最后一个条目。如果它在任何地方切换,那么它就不会拥有所有必需的信息。可能有更简洁的方法来做到这一点,但这有效(在我这边测试过)。
编辑:糟糕,如果 MY_WINDOW 匹配,忘记更改中间的变量。这需要更正。
编辑 2:使用 table.insert 清除冗余。只需要一次,只需要确保先创建table。