【发布时间】: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参数根本没有使用,您正在循环体内重新分配循环计数器 - 这只是自找麻烦。 -
感谢大狼的输入。我试图慢慢构建我的代码,希望它能够正常工作,但最终还是失败了。