我正在学习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文件执行此操作,并且我试图从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
嗯,它在"中给出错误,对于ind,objData成对(Objectivelist)do"一句话,说期待一张桌子并且没有。
我不明白错误在哪里:(,你能帮助我吗?。
谢谢:)
PS:我不知道匹配代码,但是我会尝试学习如何在目标代码工作时对值进行更严格的检查:)
答案 0 :(得分:7)
您可以自行拆分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
在实际代码中,您可以使用更严格的模式。例如,检查坐标的值是否真的是数字。
答案 1 :(得分:0)
如果您只是原型设计,那么您可以使用我的Shan Carter先生的数据转换器 - 我最近添加了Lua支持。
http://thdoan.github.io/mr-data-converter/
您可以输入CSV或制表符分隔的数据,它将输出两种不同类型的Lua表:字典表和数组表(您的示例)。