Как разобрать показанный файл конфигурации, чтобы создать желаемую таблицу lua? - PullRequest
1 голос
/ 04 апреля 2019

Я хочу проанализировать конфигурационный файл, который имеет такую ​​информацию, как:

[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, но не смог получить вывод, который я ищу, из-за повторения строк в каждой секции, такой как '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

В принципе, у меня проблемы с созданием ФИНАЛЬНОЙ СТРУКТУРЫ СТОЛА, которая мне нужна. v здесь различные значения строки «Тип». У меня проблемы с размещением в таблице. В настоящее время я работаю над поиском решения, но я подумал, что могу попросить о помощи.

1 Ответ

2 голосов
/ 04 апреля 2019

Это должно работать для вас. Просто измените имя файла на то место, где хранится ваш файл конфигурации.

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. Нужно только один раз, просто нужно убедиться, что таблица создана первой.

...