Преобразование CSV-файла в таблицу с определенными ключами в Lua


Я изучаю Lua, чтобы создавать скрипты для авиасимулятора.

У меня есть CSV-файл, который выглядит следующим образом:

Poti city, Poti,red,-295731.42857144,617222.85714285  
Lanchhuti city, Poti,red,-299217.14285715,647851.42857142  
Ozurgeti city, Poti,red,-317217.14285715,648422.85714285  
Samtredia city, Poti,red,-287502.85714287,672022.85714285  
Abasha city, Poti,red,-284245.71428573,661108.57142857

Каждая строка содержит 5 полей (city, region, coalition, coordinate-x и coordinate-y в системе отсчета координат тренажера).

Мне нужно прочитать этот файл как таблицу lua, которая должна выглядеть следующим образом:

citylist = {
           [1]
           {
              ["city"] = "Poti city",
              ["region"] = "Poti",
              ["coalition"] = "red",
              ["coordinate-x"] = -295731.42857144,
              ["coordinate-y"] = 617222.85714285,
           },
           [2]
           { ....... etcetc

}

Я также должен сделать это для некоторых различных csv-файлов, и я попытался посмотреть на некоторые функции CSV от luawiki, но я честно не понял много. Не могли бы вы записать пример кода, который должен работать для разбора CSV-файла, как ожидалось?

PS: в csv-файлах никогда не бывает символов ' " '.

EDIT + ADD

ОК код из ответа 1, кажется, работает, но не похоже, чтобы построить таблицу, как выше. Как новичок, я постараюсь объяснить как можно лучше.

Я попытался разобрать этот текст:

123,Poty city,Poti,red,-295731.42857144,617222.85714285
124,Lanchhuti city,Poti,red,-299217.14285715,647851.42857142
125,Ozurgeti city,Poti,red,-317217.14285715,648422.85714285
126,Samtredia city,Poti,red,-287502.85714287,672022.85714285

С этим кодом:

do  
    local OLo = io.open(lfs.writedir() .. "Logs/" .. "Objectivelist.txt", "r")
    local Objectivelist = {}
    for line in io.lines(OLo) do
        local objID, objName, objRegion, objCoalition, objCoordx, objCoordy = line:match("%s*(.-),%s*(.-),%s*(.-),%s*(.-),%s*(.-),%s*(.-)")
        Objectivelist[#Objectivelist + 1] = { ["objID"] = objID, ["objName"] = objName, ["objRegion"] = objRegion, ["objCoalition"] = objCoalition, ["objCoordx"] = objCoordx, ["objCoordy"] = objCoordy }
    end
end

А затем попробуйте перестроить немного другой вывод для отладки с помощью этого кода:

do
    local fName = "DGWS-DEBUG-objectivelist.doc"
    local f = io.open(lfs.writedir() .. "Logs/" .. fName, "w")
    local debugOBJ = ""

    for ind, objData in pairs(Objectivelist) do
        debugOBJ = debugOBJ.. objData.objID .. "," .. objData.objName .. "," .. objData.objRegion .. "," .. objData.objCoalition .. "," .. objData.objCoordx .. "," .. objData.objCoordy .. "n"
    end

    f:write(debugOBJ)

end 

Ну, это дает ошибку в строке "for ind, objData in pairs (Objectivelist) do", говоря, что ожидаете таблицу и получили ноль.

Я не понимаю, где ошибка : (, вы можете мне помочь?.

Спасибо :)

PS: Я не знаю кодов соответствия, но я постараюсь научиться делать более строгую проверку значений, как только предполагаемый код будет работать:)

2 4

2 ответа:

Вы можете разделить CSV-файл самостоятельно. Прочитайте файл и используйте сопоставление шаблонов для получения каждого поля, а затем сохраните поля в таблице.

local citylist = {}
for line in io.lines("citys.csv") do
    local city, region, coalition, coordinate_x, coordinate_y = line:match("%s*(.-),%s*(.-),%s*(.-),%s*(.-),%s*(.-)")
    citylist[#citylist + 1] = { city = city, region = region, coalition = coalition, coordinate_x = coordinate_x, coordinate_y = coordinate_y }
end

В реальном коде можно использовать более строгий шаблон. Например, проверьте, что значения координат действительно являются числами.

Если вы просто прототипируете, то можете использовать мою вилку Mr Data Converter Шана Картера-я недавно добавил поддержку Lua.

Http://thdoan.github.io/mr-data-converter/

Вы можете ввести CSV или разделенные табуляцией данные, и он выведет два различных типа таблиц Lua: таблицу справочника и таблицу массива (ваш пример).