2

这一定很容易,但我找不到解决方案:我有一个文本文件,其中包含这种形式的数据:

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

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

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

但我不知道如何从 A 到 B。结构已经存在,但我怎样才能将它读入 Lua?

4

2 回答 2

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

笔记

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

编辑

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

于 2012-09-20T13:03:12.540 回答
1

假设您可以在一行中读取并获取|'s 之间的各个项目,算法将是这样的(伪代码,我将使用 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 步)。如果您不确定能够执行的操作,我建议您从这个 lua-users 教程中查看“作为数组的表格”和“作为字典的表格” 。

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

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

你的意思是:

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

所以这就是伪代码应该给你的。

于 2012-09-20T12:52:35.790 回答