【问题标题】:Lua: Parsing and Manipulating Input with Loops - Looking for GuidanceLua:使用循环解析和操作输入 - 寻找指导
【发布时间】:2015-01-30 21:18:16
【问题描述】:

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

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 编程”书籍,这就是我试图模拟我的函数的方式。但我在建立连接时遇到问题。

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

干杯。

【问题讨论】:

  • 您的loop_input 相当混乱。您的 input 参数根本没有使用,您正在循环体内重新分配循环计数器 - 这只是自找麻烦。
  • 感谢大狼的输入。我试图慢慢构建我的代码,希望它能够正常工作,但最终还是失败了。

标签: string parsing loops lua


【解决方案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

【讨论】:

  • 感谢lhf的帮助。我正在尝试使用您在上面提供的代码,并且我不断收到 for 循环“尝试调用字符串值”的错误。如果我把它分解,我就会明白代码在做什么。如果我记下 for 循环,并在它们之前打印变量,它们就会被捕获并按预期返回。所以现在我在将data 变量解析为四个较小的变量时遇到了问题。看看你的代码,现在我明白了你是怎么做的,这很有意义。虽然,只要变量存在,这会继续抓取变量吗?
  • @Pwrcdr87,我提供的代码在Lua live demo 中运行良好。无论如何,当从字符串中提取四个字段时,循环将继续工作。
  • 我发现了我的问题。我忘记了data:gmatch 的“g”。再次感谢大家的帮助!
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多