Lua разбивает строки на ключи и значения таблицы


Поэтому я хочу разделить две строки и получить таблицу, в которой одна строка будет равна ключам, а другая-значениям.

Итак, если:

String1 = "Key1,Key2,Key3,Key4,Key Ect..."
String2 = "Value1,Value2,Value3,Value4,Value Ect..."

Выводом будет таблица в виде folows:

Key1 - Value1
Key2 - Value2
Key3 - Value3
Key4 - Value4
Key Ect... - Value Ect...

Я смотрел на эту функцию разделения, которую я нашел на Lua wiki

split(String2, ",")

function split(String, pat)
   local t = {}  -- NOTE: use {n = 0} in Lua-5.0
   local fpat = "(.-)" .. pat
   local last_end = 1
   local s, e, cap = str:find(fpat, 1)
   while s do
      if s ~= 1 or cap ~= "" then
     table.insert(t,cap)
      end
      last_end = e+1
      s, e, cap = str:find(fpat, last_end)
   end
   if last_end <= #str then
      cap = str:sub(last_end)
      table.insert(t, cap)
   end
   return t
end

Но, конечно, это только возвращает:

1 - Value1
2 - Value2

И так далее...

Я собираюсь начать пытаться модифицировать этот код, но я не знаю, как далеко я продвинусь.
2 2

2 ответа:

Вы можете использовать его непосредственно так:

local t1 = split(String1, ",")
local t2 = split(String2, ",")

local result = {}

for k, v in ipairs(t1) do
    result[v] = t2[k]
end

Или создайте свой собственный итератор:

local function my_iter(t1, t2)
    local i = 0
    return function() i = i + 1; return t1[i], t2[i] end
end

local result = {}

for v1, v2 in my_iter(t1, t2) do
    result[v1] = v2
end

Приведенный ниже код позволяет избежать создания двух временных таблиц:

   function join(s1,s2)
        local b1,e1,k=1
        local b2,e2,v=1
        local t={}
        while true do
            b1,e1,k=s1:find("([^,]+)",b1)
            if b1==nil then break end
            b1=e1+1
            b2,e2,v=s2:find("([^,]+)",b2)
            if b2==nil then break end
            b2=e2+1
            t[k]=v
        end
        return t
    end

    String1 = "Key1,Key2,Key3,Key4"
    String2 = "Value1,Value2,Value3,Value4"

    for k,v in pairs(join(String1,String2)) do
        print(k,v)
    end