Io 从csv文件到表中读取双值

Io 从csv文件到表中读取双值,io,lua,Io,Lua,首先我想说的是,这是我在Lua的第一个项目。我需要开发一个Lua应用程序,它可以读取CSV文件。该文件由四列和未知行数组成。所以我必须读到文件的最后一行。在每行中,存储点的xyz坐标。这些坐标存储为双值。现在我必须将csv文件中的值复制到一个表(Lua中的数组)。在文件的后面,我必须为igm机器人编辑一个机器人程序。所以我需要这张桌子。到目前为止,我有休闲代码,但我不确定这是否是开始这项工作的正确方法: local open = io.open local function read_file

首先我想说的是,这是我在Lua的第一个项目。我需要开发一个Lua应用程序,它可以读取CSV文件。该文件由四列和未知行数组成。所以我必须读到文件的最后一行。在每行中,存储点的xyz坐标。这些坐标存储为双值。现在我必须将csv文件中的值复制到一个表(Lua中的数组)。在文件的后面,我必须为igm机器人编辑一个机器人程序。所以我需要这张桌子。到目前为止,我有休闲代码,但我不确定这是否是开始这项工作的正确方法:

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合作过,文档对我来说真的很难理解。因此,如果您能给我任何帮助,我将不胜感激

编辑:我现在与该帖子一起更新我的代码。为了将表格打印到屏幕,我使用了print命令。但是这样我就得到了
0069b568
。所以我的想法是使用
作为
循环。但这是行不通的。有人能告诉我如何在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;

您可以使用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
将替换为
坐标[line]中的值。坐标\u x
,第二个带有
坐标[line]。坐标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

现在,您可以对这些值执行数学运算。这还允许您对输出进行更多控制:例如,将上述格式表达式中的
%s
替换为
%.2f
,以始终使用两个十进制数字显示数字。

感谢您的帮助。我还有一个问题。当我想在LuaEdit中调试我的脚本时,我得到了一条错误消息,它希望在
print
附近有一个
do
命令。因此,我的for循环似乎不正确。发现错误后,我忘记了for循环中的操作,但它仍然不起作用。坐标do中的线的代码
似乎为假,如果要在表格上迭代,您可以使用
ipairs
在表格上迭代,我已相应地更新了答案。还请注意,我清理了
read_file
方法,因为没有必要的代码。我尝试了
for
-循环的代码,但当我开始调试时,收到错误消息bad arguement#1以格式化。由于忘记了符号,我不得不稍微修改一下代码,但基本上我使用了你的代码。所以这里是:
对于u,在ipairs中的坐标(坐标)不打印((((“X:%s,Y:%s,Z:%s”):格式(坐标X,坐标Y,坐标Z))结束