2016-11-10 3 views
0

私は自分のarray2dにいくつか問題があります。私は実際にリフレッシュコマンドを持っている計画したい。luaリフレッシュ/ replace array2d

data.txtを

test1:30:1 
test2:40:2 

上の私のデータは、だから私は機能READDATAを呼び出したときに。それは私のArray2dに次のようなものを送ります:

line_data = {{"test1", "30", "1"}, 
      {"test2", "40", "2"}} 

しかし、問題はすべて私が関数を呼び出すことです。それは常に同じデータを追加する、私はちょうど私がいくつかのイベントを行うとき、私はちょうどリフレッシュするか、または置き換えたいです。 私のコードは

line_data = {} 

function ReadData() 
    local file = io.open("data.txt", "r") 
    for line in file:lines() do 
     line_data[#line_data+1] = { line:match('([^:]+):(%d+):(%d+)') } 
    end 
end 

多分あなたたちがこのような状況で私を助けることができますか?

+0

これは一般的に答えられません。どのようにデータを取得しますか?ラインが新しいかどうかはどうやって分かりますか? 2つの単純なケースについて私は自発的に考えることができます: 新しい行が単にファイルに追加されるか、先頭行( "header")で行を区別することができます:test1、test2、testN。これは本当ですか? – pschulz

+0

oops私の悪い、この 'line_data = {}'。実際には最初はヌルです。私はちょうど呼び出し関数を呼び出すしようとするたびに値を含む保存された配列であることを宣言します。 – Han

+0

この行をループ 'line_data [#line_data + 1] = {行:match( '([:] +):(% d +):(%d +) ')}。すでに行:分割で値が分かれている配列を作成します。 – Han

答えて

1

:そのIDは、文字列のすなわち最初の部分だけの名前である場合、あなたは、配列にデータを追加行を変更。だから私は最善の方法は、読み込み関数自体から配列を取得し、古いものを置き換えることだと思う。ここに私の例:

function ReadData(_path) 
    local tmp = {} 
    local file = io.open(_path, "r") 
    for line in file:lines() do 
     tmp[#tmp+1] = { line:match('([^:]+):(%d+):(%d+)') } 
    end 
    file:close() 
    return tmp 
end 

function Array2dAsStr(_array) 
    local function cutRight(_s, _i) 
     _i = _i or 1 
     return _s:sub(1, (_s:len())-1*_i) 
    end 
    local sOut = '{' 
    for _, v in pairs(_array) do 
     sOut = sOut..'{' 
     for _, v1 in pairs(v) do 
      sOut = sOut..v1..',' 
     end 
     sOut = cutRight(sOut)..'},' 
    end 
    return cutRight(sOut)..'}' 
end 

line_data = ReadData("data.txt") 
print(Array2dAsStr(line_data)) 

-- if you read again the file, the old stuff from line_data will overwritten 
line_data = ReadData("data.txt") 
print(Array2dAsStr(line_data)) 
+0

これは私が意味するものです。はい、うまくいきます。ありがとう! – Han

0

既存の行に新しいデータを入力する場合は、いくつかのIDが必要です。私は右に理解している場合、あなたは再読み込みファイルの後line_dataを上書きします

-- old code  
-- line_data[#line_data+1] = { line:match('([^:]+):(%d+):(%d+)') } 

-- new code 
local name, score1, score2 = line:match('([^:]+):(%d+):(%d+)') 
line_data[name] = {score1, score2}