首先我想提一下,这是我在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;
答案 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
,以始终显示带有两位小数的数字。