我是Lua的新手,所以我有一些麻烦从csv文件读取数据到表。 csv文件由四列组成。第一列是一个字符串,其他三个是双精度值。 我想要做的是:打开文件,读入数据并处理数据。 为了测试我想将数据打印到屏幕上。稍后我必须打开另一个文件,一个机器人程序,并将数据传递给该程序。
我使用consol命令lua Script.lua
执行脚本。但我得到的只是错误消息lua: Script.lua:22: bad argument #1 to ´format´ (number expected, got nil)
stack traceback: [C]: in function ´string.format´ script.lua:22: in main chunk [C]: in?
有人可以告诉我我做错了吗?
编辑:所以我稍微改变了我的Scritp。所以这是我的新代码
local open = io.open
local function read_file(path)
local file = open(path, "r") -- r read mode and b binary mode
--if not file then return nil end
local coordinates = {}
for line in io.lines(path) do
local coordinate_name, coordinate_x, coordinate_y, coordinate_z = line:match("%s*(.-),%s*(.-),%s*(.-),%s*(.-)")
coordinates[#coordinates+1] = { coordinate_name=coordinate_name, coordinate_x = tonumber(coordinate_x), coordinate_y = tonumber(coordinate_y), coordinate_z = tonumber(coordinate_z) }
end
--file:close()
return coordinates
end
local coordinates = read_file("data.csv")
for _, coordinate in ipairs(coordinates) do -- use pairs or ipairs to iterate over tables
print(("X: %s, Y: %s, Z: %s"):format(coordinate.coordinate_x,
coordinate.coordinate_y,
coordinate.coordinate_z))
end
return 0;
现在我可以执行脚本,但打印到屏幕上的所有内容都是:X: nil, Y: nil, Z: nil
。据我了解LUA,nil
表示没有读取任何值。
编辑:我想要阅读的文件如下所示:
After;-5;-5;0;
After;-2;-5;0;
After;5;-5;0;
After;5;-2;0;
After;5;5;0;
After;2;5;0;
After;-5;5;0;
After;-5;2;0;
After;-5;-5;0;
Intersects;5;-4;0
Intersects;-5;-4;0
Intersects;-5;-3;0
Intersects;5;-3;0
Intersects;5;-2;0
Intersects;-5;-2;0
编辑:现在更新的代码:
local open = io.open
local function read_file(path)
local file = open(path, "r") -- r read mode and b binary mode
--if not file then return nil end
local coordinates = {}
for line in io.lines(path) do
local coordinate_name,
coordinate_x,
coordinate_y,
coordinate_z = line:match("%s* (.*);%s*(.*);%s*(.*);%s*(.*);%s*(.*)")
coordinates[#coordinates+1] = { coordinate_name = coordinate_name, coordinate_x = tonumber(coordinate_x), coordinate_y = tonumber(coordinate_y), coordinate_z = tonumber(coordinate_z) }
print(("X: %s Y: %4f Z: %s"):format(coordinates.coordinate_x,
coordinates.coordinate_y,
coordinates.coordinate_z))
end
for _, coordinate in ipairs(coordinates) do
print(coordinates.coordinate_x, coordinates.coordinate_z, coordinates.coordinate_z)
end
file:close()
return coordinates
end
local coordinates = read_file("data.csv")
for _, coordinates in ipairs(coordinates) do -- use pairs or ipairs to iterate over tables
print(("X: %s, Y: %s, Z: %s"):format(coordinates.coordinate_x,
coordinates.coordinate_y,
coordinates.coordinate_z))
end
return 0;
我正在使用Lua 5.3.3 for Windows,该脚本在LuaEdit中编写并由行lua Script.lua
调用。
答案 0 :(得分:2)
在您的模式中使用(.*)
而不是(.-)
。根据{{3}},-
将匹配最短的模式,这似乎是我测试中z坐标的错误:
更新以匹配发布的文件格式
local coordinate_name,
coordinate_x,
coordinate_y,
coordinate_z = line:match("([^;]*);([^;]*);([^;]*);([^;]*)")
tonumber
将为您处理空间修剪,您似乎没有在任何地方使用coordinate_name。如果以后需要修剪coordinate_name变量,可以选择很多docs。
完整脚本供参考。
local open = io.open
local function read_file(path)
local file = open(path, "r") -- r read mode and b binary mode
--if not file then return nil end
local coordinates = {}
for line in io.lines(path) do
local coordinate_name,
coordinate_x,
coordinate_y,
coordinate_z = line:match("([^;]*);([^;]*);([^;]*);([^;]*)")
coordinates[#coordinates+1] = { coordinate_name = coordinate_name, coordinate_x = tonumber(coordinate_x), coordinate_y = tonumber(coordinate_y), coordinate_z = tonumber(coordinate_z) }
end
file:close()
return coordinates
end
local coordinates = read_file("data.csv")
for _, coordinate in ipairs(coordinates) do -- use pairs or ipairs to iterate over tables
print(("X: %s, Y: %s, Z: %s"):format(coordinate.coordinate_x,
coordinate.coordinate_y,
coordinate.coordinate_z))
end
return 0;