If statement 具有奇怪行为的Lua控制状态

If statement 具有奇怪行为的Lua控制状态,if-statement,lua,lua-table,If Statement,Lua,Lua Table,我从基本的控制语句操作中得到了一个非常意外的结果。我有以下内容,一个使用此类数据读取的文件: 1, 51, one , ab 1, 74, two , ab 0, 74, tree , ab 0, 74, for , ab 0, 74, five , ab 我的Lua代码片段处理它: if file then for line in file:lines() do LineArray = line CanClaimInfo[LineArray] = {} lineData = utils.sp

我从基本的控制语句操作中得到了一个非常意外的结果。我有以下内容,一个使用此类数据读取的文件:

1, 51, one , ab
1, 74, two , ab
0, 74, tree , ab
0, 74, for , ab
0, 74, five , ab
我的Lua代码片段处理它:

if file then
for line in file:lines() do
LineArray = line
CanClaimInfo[LineArray] = {}
lineData = utils.split(line,",")
    if lineData[1] == "0"  then
        lineData[1] = "CAN A"
    elseif lineData[1] == "1" then
        lineData[1] = "CAN B"
    else
        lineData[1] = lineData[1]
    end
CanClaimInfo[LineArray]["CANBus"] = lineData[1]
CanClaimInfo[LineArray]["Address"] = lineData[2]
CanClaimInfo[LineArray]["Name"] = lineData[3]
end
我把它作为一个输出:

CAN A   74  for
CAN A   74  tree
CAN A   74  five
CAN B   74  two
1       51  one

我不知道它是如何通过
elseif lineData[1]==“1”然后
位的。我检查过了,没有前导/尾随空格或类似的内容。有什么想法吗?

Hm,您的utils.split函数似乎有一些问题。我使用了来自的函数,它与您的代码配合得很好:

utils = {
    split = function(str, pat)
       local t = {}  -- NOTE: use {n = 0} in Lua-5.0
       local fpat = "(.-)" .. pat
       local last_end = 1
       local s, e, cap = str:find(fpat, 1)
       while s do
          if s ~= 1 or cap ~= "" then
         table.insert(t,cap)
          end
          last_end = e+1
          s, e, cap = str:find(fpat, last_end)
       end
       if last_end <= #str then
          cap = str:sub(last_end)
          table.insert(t, cap)
       end
       return t
    end
}
utils={
拆分=功能(str、pat)
局部t={}——注意:在Lua-5.0中使用{n=0}
本地fpat=“(.-)”。pat
本地最后\u端=1
局部s,e,cap=str:find(fpat,1)
当我们做的时候
如果s~=1或cap~='',则
表.插入(t,cap)
终止
最后一端=e+1
s、 e,cap=str:find(fpat,last_end)
终止

如果last_endHm,您的utils.split函数似乎有一些问题。我使用了来自的函数,它与您的代码配合得很好:

utils = {
    split = function(str, pat)
       local t = {}  -- NOTE: use {n = 0} in Lua-5.0
       local fpat = "(.-)" .. pat
       local last_end = 1
       local s, e, cap = str:find(fpat, 1)
       while s do
          if s ~= 1 or cap ~= "" then
         table.insert(t,cap)
          end
          last_end = e+1
          s, e, cap = str:find(fpat, last_end)
       end
       if last_end <= #str then
          cap = str:sub(last_end)
          table.insert(t, cap)
       end
       return t
    end
}
utils={
拆分=功能(str、pat)
局部t={}——注意:在Lua-5.0中使用{n=0}
本地fpat=“(.-)”。pat
本地最后\u端=1
局部s,e,cap=str:find(fpat,1)
当我们做的时候
如果s~=1或cap~='',则
表.插入(t,cap)
终止
最后一端=e+1
s、 e,cap=str:find(fpat,last_end)
终止

if last_end可能是文件开头的utf-8编码字节?在“if”测试之前尝试打印lineData[1]以查看它是什么,并
打印(#lineData[1])
以查看它有多少个字符。可能超过1个字符,因此它会在第三个分支中结束(否则):


要找到额外的字节,请尝试
print(string.byte(lineData[1],1,#lineData[1])
可能是文件开头的utf-8编码字节?尝试在“if”测试之前打印lineData[1]以查看它是什么,以及
print(#lineData[1])
以查看它有多少个字符。可能超过1个字符,因此它最终会出现在第三个分支中(其他):


要找到额外的字节,请尝试
print(string.byte(lineData[1],1,#lineData[1])

我有一个精确的拆分函数,行对行。我还尝试了“or lineData[1]==1”来捕捉数字,但没有运气。这不会是问题,因为它只在第一行(地址“51”)失败我有一个精确的分割函数,一行一行。我还尝试了“或lineData[1]==1”来捕捉数字,但没有运气。这不会是问题,因为它只对第一行(地址“51”)失败。我也认为它隐藏了一些编码位,但我尝试了打印lineData[1]直接打印出来,我似乎找不到任何证据。但是仅仅打印线条数据[1]可能不会显示它,您打印了它的长度吗?@Nimjox肯定会打印出来,因为那时替换已经丢失。为什么不直接打印(#线条数据[1])
,然后在if块之前执行此操作,以便查看未处理的数据?所有行的输出都应为1,除非您知道在哪里挖掘。@Nimjox,这是计算单词字符数。这将完全忽略OP询问的非单词编码字符的种类。不要玩游戏,以获得相同的计数k lua谢谢。试试
linedata[1]=linedata[1].“
。我想你们可能会得到四个。你们搞定了。非常感谢。我返回了#linedata[1]直接得到第一个的所有1和4。呃,你知道那些前导位可能是什么吗?我也认为这是某种编码位隐藏,但我尝试直接打印lineData[1],似乎找不到任何证据。只是打印lineData[1]可能不会显示它,您打印了它的长度吗?@Nimjox肯定会打印出来,因为到那时替换已经丢失了。为什么不打印(#lineData[1])
,然后在if块之前执行此操作,以便查看未处理的数据?所有行的输出都应为1,除非您知道在哪里挖掘。@Nimjox,这是计算单词字符数。这将完全忽略OP询问的非单词编码字符的种类。不要玩游戏,以获得相同的计数k lua谢谢。试试
linedata[1]=linedata[1].“
。我想你们可能会得到四个。你们搞定了。非常感谢。我返回了#linedata[1]直接得到第一个的所有1和4。呃,你知道那些前导位可能是什么吗?所以我刚刚意识到我使用的拆分函数与Henrik Ilgen链接的LUA版本5.1和5.2相同。我怀疑这是我问题的根源。所以我才意识到拆分函数我使用的是与Henrik Ilgen链接的LUA版本5.1相同的,我目前使用的是5.2。我怀疑这是我问题的根源。