从csv文件读取双精度值到表格中

首先我想提到这是我第一次编写Lua程序。我需要开发一个Lua应用程序,来读取CSV文件。该文件包含四列和一个未知数量的行。因此我必须读取文件的所有行。在每一行中存储着点的xyz坐标。这些坐标存储为双精度值。现在我需要将这些值从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;
点赞
用户570336
用户570336

你可以使用 string.format 来美观地输出你的值:

local coordinates = read_file("data.csv")
for _, coordinate in ipairs(coordinates) do  -- 使用 pairs 或 ipairs 遍历表格
    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 则使用“自然”顺序,这里并没有指定逻辑 ;)

但是,由于我猜想你将想要对这些值进行更多操作,而不仅仅是将它们输出,所以你可能要考虑将它们存储为数字;请修改你的脚本如下:

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

现在,你可以对这些值执行数学运算了。这也允许你更好地控制输出:例如,在上面的格式表达式中用 %.2f 替换 %s,总是显示数字的两位小数。

2016-06-21 10:33:40