2016-11-07 95 views
4

對不起,我仍在學習關於lua。你能糾正我,爲什麼從文件中的數據不會逐行閱讀?將文件逐行讀入數組

這是在文件points.txt我的示例性數據:

lexxo:30:1 
rey:40:2 
lion:40:2 
prince:50:3 
royal:50:3 

因此,當我從上面得到的是2D陣列(表)

player = {{(name),(points),(which var point earned on index)}, 
      {(...),(...),(...)}}; 

所以問題是,當我嘗試循環打印文件中的所有數據。它只打印最新的一行。所以,我想打印所有的人都

line_points = {} 
player_data = {{}} 

local rfile = io.open("points.txt", "r") 
for line in rfile:lines() do 
    playername, playerpoint, playeridpoint = line:match("^(.-):(%d+):(%d+)$") 
    player_data = {{playername, playerpoint, playeridpoint}} 
    line_points[#line_points + 1] = player_data 
end 

for i = 1, #player_data do 
    player_checkname = player_data[i][1] -- Get Player Name From Array for checking further 
    player_checkpnt = player_data[i][3] -- Get Player ID Point From Array for checking further 
    print(i..". Name: "..player_data[i][1].." Point: ".. player_data[i][2] .. " ID: " .. player_data[i][3]); 
end 

回答

2

player_data的索引總是爲1,因爲您不添加項目到您將它們添加到#line_points爲5的line_points,因此請改用它。

這就是你想要的:?

line_points = {} 
player_data = {{}} --I think you can delete it at all... 
--Because it is rewriting each time. 

local rfile = io.open("points.txt", "r") 
for line in rfile:lines() do 
    playername, playerpoint, playeridpoint = line:match("^(.-):(%d+):(%d+)$") 
    player_data = {playername, playerpoint, playeridpoint} 
    --I also remover double table here ^^^^^^^^^^^^^^^^^^^ 
    line_points[#line_points + 1] = player_data 
end 
--Here i checked counts 
--print('#pd='..#player_data) 
--print('#lp='..#line_points) 
--After it i decided to use line_points instead of player_data 
for i = 1, #line_points do 
    player_checkname = line_points[i][1] -- Get Player Name From Array for checking further 
    player_checkpnt = line_points[i][3] -- Get Player ID Point From Array for checking further 
    print(i..". Name: "..line_points[i][1].." Point: ".. line_points[i][2] .. " ID: " .. line_points[i][3]); 
end 

輸出:

1. Name: lexxo Point: 30 ID: 1 
2. Name: rey Point: 40 ID: 2 
3. Name: lion Point: 40 ID: 2 
4. Name: prince Point: 50 ID: 3 
5. Name: royal Point: 50 ID: 3 

更新

在第一循環中單個表改變player_data assignemnt後,指望它始終將是3

+0

是的,這就是我想:)。但它的打印零值。例如,當我把這個'print(line_points [1] [2])' – Han

+1

nvm,我想通過** replace **'line_points [#line_points + 1] = player_data' **來解決它* *'line_playerachievement [#line_playerachievement + 1] = {line:match('([^:] +):(%d +):(%d +)')}'。我不知道爲什麼球員數據陣列不會工作。所以我決定刪除玩家數據,並在for循環中進行識別 – Han

3

你每次都重寫player_data一個新的記錄,收集保存在line_points;然而,在打印時,您的循環上升到#player_data(這將是1)並訪問player_data而不是line_points

你可能想要做這樣的事情:

table.insert(player_data, {playername, playerpoint, playeridpoint}) 

t[#t+1]=成語會也行,只要使用正確的表格和說明(擺脫),雙括號在您的代碼。