从csv文件读取double值到表

时间:2016-06-20 07:13:30

标签: io lua

首先我想提一下,这是我在Lua的第一个程序。我需要开发一个Lua应用程序,它读取一个CSV文件。该文件由四列和未知行数组成。因此我必须阅读直至文件行的末尾。在每一行中,存储的点的xyz坐标。这些坐标存储为double值。现在我必须将csv文件中的值复制到表(Lua中的数组)。稍后在文件中我必须为igm Robot编辑机器人程序。因此我需要这张桌子。到目前为止,我已经有了一些代码,但我不确定这是否是开始这个​​问题的最佳方式:

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 content = file:read "*a" -- *a or *all reads the whole file
    file:close()
    return content
end


os.execute("OpenGLM_3.exe -slicesize 3 -model cube_2.stl -ascii - eulerangles 0 0 0")
local fileContent = read_file("data.csv");

return 0;

首先我执行一个C ++程序,它创建了csv文件,但后来我想改变这个过程,这样c ++程序就独立于Lua脚本了。这条线只是用于测试。在此行之后,我想将csv文件中的数据读取到表中并将表打印到屏幕上。所以对我来说,我只是将文件的内容打印到命令行,这样我就可以检查脚本是否正常工作。

我之前从未与Lua合作过,而且我的文档很难理解。所以,如果你能给我任何帮助,我将不胜感激。

修改:我现在使用user3204845的帖子来更新我的代码。要将表打印到屏幕,我使用了print命令。但就这样我才得到0069b568。所以我的想法是使用for - 循环。但这不起作用。有人可以给我一个提示如何访问Lua表中的条目。继承我的代码:

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_x, coordinate_y, coordinate_z = line:match("%s*(.-),%s*(.-),%s*(.-)")
   coordinates[#coordinates+1] = { coordinate_x = coordinate_x, coordinate_y = coordinate_y, coordinate_z = coordinate_z }
    end

    file:close()
    return coordinates
end


os.execute("OpenGLM_3.exe -slicesize 3 -model cube_2.stl -ascii - eulerangles 0 0 0")
local coordinates = read_file("data.csv")
for line in coordinates
   print(coordinates[line])
end
return 0;

1 个答案:

答案 0 :(得分:2)

您可以使用string.format来打印您的值:

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

%s是字符串值的占位符:第一个%s将替换为coordinates[line].coordinate_x中的值,第二个coordinates[line].coordinate_y等等。

ipairs用于根据其索引(1,2,3,...)迭代表,而pairs使用' natural'排序,没有指定逻辑;)

但是,由于我猜你想要使用这些值而不仅仅是将它们打印出来,你可能会考虑将它们存储为数字;相应地编辑你的脚本:

local function read_file(path)
    local coordinates = {}

    for line in io.lines(path) do
        local coordinate_x, coordinate_y, coordinate_z = line:match("%s*(.-),%s*(.-),%s*(.-)")
        coordinates[#coordinates+1] = { coordinate_x = tonumber(coordinate_x), coordinate_y = tonumber(coordinate_y), coordinate_z = tonumber(coordinate_z) }
    end

    return coordinates
end

现在,您可以实际对值进行数学运算。这也允许您对输出进行更多控制:例如,将上述格式表达式中的%s替换为%.2f,以始终显示带有两位小数的数字。