2016-11-10 1 views
0

J'ai un problème avec mon array2d. Je veux vraiment avoir une commande de rafraîchissement.lua refresh/replace array2d

mes données sur donnees.txt

test1:30:1 
test2:40:2 

Donc, chaque fois que j'appelle la fonction ReadData. Il va envoyer à mon Array2d quelque chose comme ceci:

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

Mais le problème est que j'appelle la fonction. il va toujours ajouter les mêmes données, je voudrais juste rafraîchir ou remplacer peut-être, quand je fais un événement. mon code

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 

gars, vous pouvez peut-être me aider à cette situation?

+0

Il est généralement impossible de répondre à cette question. Comment obtenez-vous les données? Comment savez-vous si une ligne est nouvelle? Deux cas simples auxquels je peux penser spontanément: Une nouvelle ligne est simplement ajoutée au fichier ou vous pouvez distinguer les lignes par leur début ("header"): test1, test2, testN. Est-ce le cas? – pschulz

+0

oups mon mauvais, this 'line_data = {}'. en fait avoir zéro au début. Je le déclare juste au tableau pour être un tableau sauvé avec la valeur de contain quand j'essaye la fonction d'appel lire – Han

+0

cette ligne sur la boucle 'line_data [# line_data + 1] = {line: match ('([^:] +): (% d +): (% d +) ')}. il va faire un tableau avec une valeur contenant déjà une ligne: match. – Han

Répondre

1

, vous écraserez la line_data après re-lecture du fichier . Donc, je pense que le meilleur moyen est d'obtenir le tableau de la fonction de lecture elle-même et remplacer l'ancienne. Voici mon exemple:

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

c'est ce que je veux dire. oui, ça fonctionne bien. Merci! – Han

0

Si vous souhaitez remplir des lignes existantes avec de nouvelles données, vous avez besoin d'un identifiant. Si cet identifiant est juste le nom, soit la première partie de la chaîne, puis modifiez la ligne où vous ajoutez des données à un tableau: Si je comprends bien ai

-- 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}