Читать файл построчно в массив

извините, я все еще изучаю 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

person Han    schedule 07.11.2016    source источник


Ответы (2)


player_data всегда имеет индекс 1, потому что вы не добавляете элементы в это, вы добавляете их в line_points, где #line_points равно 5, поэтому используйте его вместо этого.

Это то, что вы хотели :?

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 в первом цикле на одну таблицу всегда будет 3.

person BladeMight    schedule 07.11.2016
comment
да, это то, что я хотел :). но это нулевое значение печати. например, когда я поставил это print(line_points[1][2]) - person Han; 07.11.2016
comment
nvm, я решил исправить это, заменив line_points[#line_points + 1] = player_data чтобы было так line_playerachievement[#line_playerachievement+1] = {line:match('([^:]+):(%d+):(%d+)')} . Я понятия не имел, почему массив данных игрока не будет работать. поэтому я решил удалить данные игрока и для идентификации в цикле for - person Han; 09.11.2016

Вы каждый раз перезаписываете player_data новой записью, а коллекция хранится в line_points; однако при печати ваш цикл доходит до #player_data (что будет равно 1) и обращается к player_data вместо line_points.

Вероятно, вы хотели сделать что-то подобное1:

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

1 Идиома t[#t+1]= также будет работать, просто используйте правильную таблицу и обратите внимание (избавьтесь) от двойных скобок в коде.

person Bartek Banachewicz    schedule 07.11.2016