如何在Lua中填充嵌套表?

如何在Lua中填充嵌套表?,lua,Lua,这一定非常简单,但我找不到解决方案:我有一个文本文件,其中包含以下格式的数据: | 1 | 1 | A | X | | | 2 | A | Z | | | | B | Y | 我想用Lua处理这些数据,所以我需要将其放在这样一个结构化(嵌套)表中(我希望缩进正确): 但是我不知道如何从A到B。结构已经有点像了,但是我如何才能将它读入Lua?假设你可以读一行,并得到之间的各个项目,算法应该是这样的(伪代码,我将使用col(n))要指示当前行第n列中的字符,请执行以下操作: 我希望这基

这一定非常简单,但我找不到解决方案:我有一个文本文件,其中包含以下格式的数据:

| 1 | 1 | A | X |
|   | 2 | A | Z |
|   |   | B | Y |
我想用Lua处理这些数据,所以我需要将其放在这样一个结构化(嵌套)表中(我希望缩进正确):


但是我不知道如何从A到B。结构已经有点像了,但是我如何才能将它读入Lua?

假设你可以读一行,并得到
之间的各个项目,算法应该是这样的(伪代码,我将使用col(n))要指示当前行第n列中的字符,请执行以下操作:

我希望这基本上是不言自明的。除了第2步之外,从伪代码到lua不应该有问题(我们不知道如何获取数据来帮助您完成第2步)。如果您不确定可执行的操作,我建议您从中查看“表作为数组”和“表作为字典”

作为旁注,您的示例似乎是在两个表中双重嵌套a=X、a=Z、B=Y。我怀疑不是:

['2'] = 
    {
        {
            { ['A'] = 'Z' },
            { ['B'] = 'Y' },
        },
    },
你的意思是:

['2'] = 
    {
        { ['A'] = 'Z' },
        { ['B'] = 'Y' },
    },

因此,这就是伪代码应该为您提供的功能。

这肯定会为您完成任务

tTable = {}
OldIDX, OldIDX2, bSwitched, bSwitched2 = 0, 0, false, false

for str in io.lines("txt.txt") do
    local _, _, iDx, iDex, sIdx, sVal = str:find( "^%| ([%d|%s]?) %| ([%d|%s]?) %| (%S?) %| (%S?) %|$" )
    if not tonumber(iDx) then iDx, bSwitched = OldIDX, true end
    if not tonumber(iDex) then iDex, bSwitched2 = OldIDX2, true end
    OldIDX, OldIDX2 = iDx, iDex
    if not bSwitched then
        tTable[iDx] = {}
    end
    if not bSwitched2 then
        tTable[iDx][iDex] = {}
    end
    bSwitched, bSwitched2 = false, false
    tTable[iDx][iDex][sIdx] = sVal
end
注 代码中唯一可以更改的是文件名。:)

编辑
看来我错了,你确实需要一些改变。我也做了。

我甚至不知道你是如何从第一个片段到第二个片段的。尝试制定每个步骤。您将有一个几乎准备就绪的程序,其中只有几个单词可以从英语转换为Lua语法。我没有从第一个块转换到第二个块-这是我的问题。我只是想展示我(认为我)需要的结构,所以我手工编写了Lua表,我希望我能接受这两个答案;它们相互补充——你的解释,巨人的代码。谢谢你们两位。关于双嵌套结构,你说得很对;我发现手工写这张桌子很麻烦。。。
['2'] = 
    {
        { ['A'] = 'Z' },
        { ['B'] = 'Y' },
    },
tTable = {}
OldIDX, OldIDX2, bSwitched, bSwitched2 = 0, 0, false, false

for str in io.lines("txt.txt") do
    local _, _, iDx, iDex, sIdx, sVal = str:find( "^%| ([%d|%s]?) %| ([%d|%s]?) %| (%S?) %| (%S?) %|$" )
    if not tonumber(iDx) then iDx, bSwitched = OldIDX, true end
    if not tonumber(iDex) then iDex, bSwitched2 = OldIDX2, true end
    OldIDX, OldIDX2 = iDx, iDex
    if not bSwitched then
        tTable[iDx] = {}
    end
    if not bSwitched2 then
        tTable[iDx][iDex] = {}
    end
    bSwitched, bSwitched2 = false, false
    tTable[iDx][iDex][sIdx] = sVal
end