2016-11-10 4 views
0

내 array2d에 몇 가지 문제가 있습니다. 사실 계획을 새로 고침하고 싶습니다. data.txt로에lua 새로 고침/replace array2d

내 데이터는

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

이것은 일반적으로 대답 할 수 없습니다. 어떻게 데이터를 가져 옵니까? 라인이 새로운 것인지 어떻게 알 수 있습니까? 두 가지 간단한 경우에 대해 자발적으로 생각할 수 있습니다. 새 줄을 단순히 파일에 추가하거나 줄 ("header")을 test1, test2, testN으로 구분할 수 있습니다. 이 경우인가요? – pschulz

+0

oops my bad,이'line_data = {}'. 실제로 처음에는 null이 있습니다. 난 그냥 호출 함수를 호출 할 때마다 값을 포함하는 저장된 배열에 대한 배열을 선언합니다 – Han

+0

이 줄에'line_data [# line_data + 1] = {line : match ('([^ :] +) d +) : (% d +) ')}. 그것은 이미 행 : 구분에 의해 분리 된 값을 포함하는 배열을 만들 것입니다. – Han

답변

1

, 당신은 파일을 다시 읽은 후 line_data를 덮어 쓸 수 있습니다 : 해당 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가 필요합니다. 내가 이해를 잘했다면

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