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