Lua脚本CSV文件到表

时间:2016-08-23 20:54:45

标签: csv file-io lua

我是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调用。

1 个答案:

答案 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;