Search code examples
lua

How do I use more then one pattern for gmatch


Hello I am trying to get some data from a text file and put it into a table. Im not sure how to add more then one pattern while also doing what I want, I know this pattern by its self %a+ finds letters and %b{} finds brackets, but I am not sure how to combine them together so that I find the letters as a key and the brackets as a value and have them be put into a table that I could use.

text file :

left = {{0,63},{16,63},{32,63},{48,63}}
right = {{0,21},{16,21},{32,21},{48,21}}
up = {{0,42},{16,42},{32,42},{48,42}}
down = {{0,0},{16,0},{32,0},{48,0}}

code:

local function get_animations(file_path)
local animation_table = {}
local file = io.open(file_path,"r")
local contents = file:read("*a")
for k, v in string.gmatch(contents, ("(%a+)=(%b{})")) do -- A gets words and %b{} finds brackets
    animation_table[k] = v
    print("key : " .. k.. " Value : ".. v)
  end
file:close()

end

get_animations("Sprites/Player/MainPlayer.txt")


Solution

  • This is valid Lua code, why not simply execute it?

    left = {{0,63},{16,63},{32,63},{48,63}}
    right = {{0,21},{16,21},{32,21},{48,21}}
    up = {{0,42},{16,42},{32,42},{48,42}}
    down = {{0,0},{16,0},{32,0},{48,0}}
    

    If you don't want the data in globals, use the string library to turn it into

    return {
        left = {{0,63},{16,63},{32,63},{48,63}},
        right = {{0,21},{16,21},{32,21},{48,21}},
        up = {{0,42},{16,42},{32,42},{48,42}},
        down = {{0,0},{16,0},{32,0},{48,0}},
    }
    

    befor you execute it.

    If you insist on parsing that file you can use a something like this for each line:

    local line = "left = {{0,63},{16,63},{32,63},{48,63}}"
    print(line:match("^%w+"))
    for num1, num2 in a:gmatch("(%d+),(%d+)") do
      print(num1, num2)
    end
    

    This should be enough to get you started. Of course you wouldn't print those values but put them into a table.