这一定非常简单,但我找不到解决方案:我有一个包含以下格式数据的文本文件:
| 1 | 1 | A | X |
| | 2 | A | Z |
| | | B | Y |
我想用Lua处理这些数据,所以我需要将它放在这样的结构化(嵌套)表中(我希望缩进正确):
t = {
['1'] =
{
['1'] =
{
{
{ ['A'] = 'X' },
},
},
['2'] =
{
{
{ ['A'] = 'Z' },
{ ['B'] = 'Y' },
},
},
},
}
但我无法弄清楚如何从A到B.结构已经有了,但我怎么能把它读成Lua?
答案 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' },
},
这就是伪代码应该给你的东西。