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

行を読み取って'との間の個々の項目に到達できると仮定すると|、アルゴリズムは次のようになります(擬似コード、現在のn番目の列の文字を示すためにcol(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チュートリアルの「配列としてのテーブル」と「辞書としてのテーブル」を確認することをお勧めします。

ちなみに、あなたの例は、2つのテーブル内にA = X、A = Z、B=Yを二重にネストしているようです。私はその代わりにそれを疑う:

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

あなたが意味した:

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

これが、擬似コードで得られるものです。

于 2012-09-20T12:52:35.790 に答える