Lua:用循环解析和操纵输入 - 寻找指导

时间:2015-01-30 21:18:16

标签: string parsing loops lua

我目前正在尝试串行解析从外部源发送的数据。一个例子就是这样:

DATA|0|4|7x5|1|25|174-24|7x5|1|17|TERW|7x5|1|9|08MN|7x5|1|1|_

这些数据可以有许多不同的长度,但前几个部分都是相同的。每个“片段”最初都带有CRLF,所以我用string.gsub(input,"\r\n","|")替换它们,这就是为什么我的输入看起来像它的方式。

我要解析的部分是:

4|7x5|1|25|174-24|7x5|1|17|TERW|7x5|1|9|08MN|7x5|1|1|_

“4”告诉我总共有四行来创建这个文件。我正在使用它作为设置循环中传递量的方法。 7x5是字体高度。 1是xpos。 25是ypos。 可变数据(在这种情况下为172-24)是这些参数的文本。 如您所见,它应该继续在收到的输入字符串中循环此模式。现在“4”实际上可以是任何变量> 0;每个数字等于一组四个要捕获的变量。

这是我到目前为止所拥有的。请原谅loop变量,start变量和print命令。我正在使用Linux来运行此功能以尝试进行故障排除。

function loop_input(input)
  var = tonumber(string.match(val, "DATA|0|(%d*).*"))
  loop = string.match(val, "DATA|0|")
  start = string.match(val, loop.."(%d*)|.*")
  for obj = 1, var do
    for i = 1, 4 do
        if i == 1 then
          i = "font" -- want the first group to be set to font
        elseif i == 2 then
          i = "xpos" -- want the second group to be set to xpos
        elseif i == 3 then
          i = "ypos" -- want the third group to be set to ypos
        else
          i = "txt" -- want the fourth group to be set to text
        end
      obj = font..xpos..ypos..txt
      --print (i)
    end
  objects = objects..obj -- concatenate newly created obj variables with each pass
  end
end

val = "DATA|0|4|7x5|1|25|174-24|7x5|1|17|TERW|7x5|1|9|08MN|7x5|1|1|_"

print(loop_input(val))

理想情况下,我想创建一个循环,根据var变量,将在管道分隔符之间插入捕获的变量,然后我可以随意使用它们。当试图用我的四个变量(如上所述)的括号进行故障排除时,我连续四次收到四个变量的完整列表。现在我很难在输入字符串中循环并实际抓住它们,因为循环向下移动数据字符串。我当时认为使用管道作为相互描述变量的手段会有所帮助。我错了吗?如果没关系,我可以保留[/r/n]+而不是每个"|",那么我绝对是为了这一切。

我已经四处搜索并发现了一些我认为会有所帮助的线程,但我不确定表格或分割输入是否可取。像这些线程一样:

Setting a variable in a for loop (with temporary variable) Lua

How do I make a dynamic variable name in Lua?

Most efficient way to parse a file in Lua

我是编程和尝试自学的新手。所以请原谅我的初学者帖子。我有平装书中的“Lua参考手册”和“Lua编程”书籍,这就是我试图模仿我的功能的方法。但是我在连接方面遇到了问题。

感谢大家提供的任何意见或指导!

干杯。

1 个答案:

答案 0 :(得分:1)

试试这个:

val = "DATA|0|4|7x5|1|25|174-24|7x5|1|17|TERW|7x5|1|9|08MN|7x5|1|1|_"
val = val .. "|"
data = val:match("DATA|0|%d+|(.*)$")  
for fh,xpos,ypos,text in data:gmatch("(.-)|(.-)|(.-)|(.-)|") do
    print(fh,xpos,ypos,text)
end