如何解析显示的配置文件以创建所需的lua表?

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

我想解析一个配置文件,其中包含以下信息:

[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

进入LUA表如下

CPU_TRACE_WINDOWS = 
{
  ["cpu0"] = {{address = 0xA0B0C0D0, size = 0x100},{address = 0xB0C0D0A0, size = 0x200},}
  ["cpu1"] = {{address = 0xC0D0A0B0, size = 0x100},...}
}

我尝试了一些基本的LUA字符串操作函数,但由于在“地址”,“大小”,“类型”等每个部分重复字符串,无法获得我正在寻找的输出。此外,我的实际配置文件很大,有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

基本上我在提出我需要的最终表结构方面遇到了麻烦。 v这里是字符串“Type”的不同rvalues。我在将问题安排在表格中时遇到了问题。我目前正在努力寻找解决方案,但我认为我可以同时寻求帮助。

lua lua-table
1个回答
2
投票

这应该适合你。只需将文件名更改为存储配置文件的位置即可。

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短语并重置变量。如果表存在于CPU_TRACE_WINDOWS中,那么它只会附加一个新的表值,否则只会创建它。请注意,这取决于Type始终是最后一个条目。如果它在任何地方切换,那么它将没有所有必需的信息。可能有一种更简洁的方法,但这是有效的(在我的测试结束)。

编辑:糟糕,如果MY_WINDOW匹配,忘记更改中间的变量。这需要纠正。

编辑2:使用table.insert清除冗余。只需要一次,只需要确保首先创建表。

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