如何在Lua中填充嵌套表?

时间:2012-09-20 07:36:29

标签: lua

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

| 1 | 1 | A | X |
|   | 2 | A | Z |
|   |   | B | Y |

我想用Lua处理这些数据,所以我需要将它放在这样的结构化(嵌套)表中(我希望缩进正确):

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

但我无法弄清楚如何从A到B.结构已经有了,但我怎么能把它读成Lua?

2 个答案:

答案 0 :(得分:2)

这肯定会为你完成任务。

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

您可以在代码中更改的唯一内容是文件的名称。 :)

修改

好像我错了,你确实需要做一些改变。也是他们。

答案 1 :(得分:1)

假设你可以读到一行并找到|之间的单个项目,算法将是这样的(伪代码,我将使用col(n)来表示中的字符当前行的第n列):

1. store current indices for columns 1 and 2 (local vars)
2. read line (if no more lines, go to 7.)
3. if col(1) not empty - set the currentCol1 index to col(1)
    a. if t[currentCol1] == nil, t[currentCol1] = {}
4. if col(2) not empty - set the currentCol2 index to col(2)
    a. if t[currentCol1][currentCol2] == nil, t[currentCol1][currentCol2] = {}
5. set t[currentCol1][currentCol2][col(3)] = col(4)
6. go to step 2.
7. return t

我希望这大多是自我解释的。除了第2步之外,你不应该遇到从伪代码到lua的问题(我们不知道你是如何获得这些数据来帮助你完成第2步的)。如果您不确定能否操作,我建议从this lua-users tutorial查看“Tables as arrays”和“Tables as dictionaries”。

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

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

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

这就是伪代码应该给你的东西。