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

Lua: Parsing and Manipulating Input with Loops - Looking for Guidance

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

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

这些数据可以有很多不同的长度,但前几段都是一样的。每个 "piece" 最初都是在 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 是错误的。 变量数据(在本例中为 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 Reference Manual" 和 "Programming in Lua" 平装书,这就是我试图模拟我的功能的方式。但是我在建立连接时遇到了问题。

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

干杯。

试试这个:

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