parsing - 将 CSV 文件转换为在 Lua 中定义键的表

标签 parsing csv lua lua-table

我正在学习 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 个字段(cityregioncoalitioncoefficient-x模拟器坐标引用系中的坐标-y)。

我需要将此文件作为 lua 表读取,应如下所示:

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

}

我还必须对一些不同的 csv 文件执行此操作,并且我尝试从 luawiki 查找一些 CSV 函数,但老实说我不太了解。 您能否写下一个可以按预期解析 CSV 文件的代码示例?

PS:csv 文件中从来没有任何 ' "' 字符。

编辑+添加

好吧,答案 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 inpairs(Objectivelist) do”行中给出了错误,表示期望一个表并得到 nil。

我不明白错误在哪里:(,你能帮我吗?

谢谢:)

PS:我不知道匹配代码,但我会尝试学习如何在预期代码起作用后立即对值进行更严格的检查:)

最佳答案

您可以自行拆分 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

在实际代码中,您可以使用更严格的模式。例如,检查坐标值是否确实是数字。

关于parsing - 将 CSV 文件转换为在 Lua 中定义键的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176388/

相关文章:

javascript - 在jsp中读取一个json对象

Ruby 正则表达式匹配关键字之间的所有内容

python csv register_dialect

if-statement - Lua Math.random 和 if 语句

c++ - 如何从 Lemon 语法中删除函数调用歧义?

python - 学习python中的解析器

c# - 使用 TextFieldParser 处理包含未转义双引号的字段

c++ - (C++) 读取 CSV 文件并使用信息创建对象(这将成为一个链表)

从 Lua 调用 C 库函数

datetime - 根据 UTC 获取 future 事件的本地时间