逐行读取文件到数组中

时间:2016-11-07 08:26:19

标签: lua lua-table luafilesystem

抱歉,我还在学习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 个答案:

答案 0 :(得分:3)

您每次都会使用新记录覆盖player_data,并且该集合会保留在line_points中;但是,在打印时,您的循环上升到#player_data(这将是1)并访问player_data而不是line_points

你可能想做类似 1

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

1 t[#t+1]=成语也可以,只需使用正确的表格并注释(除去)代码中的双括号。

答案 1 :(得分: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。