【问题标题】:Reading a column file of x y z into table in Lua将 x y z 的列文件读入 Lua 中的表
【发布时间】:2017-11-16 23:06:12
【问题描述】:

一直试图通过 Lua 找到我的方式,所以我有一个包含 N 行数字的文件,每行 3 个,它实际上是 x,y,z 坐标。我可以把它变成一个 CSV 文件并使用一些 Lua CSV 解析器,但我想我还是学习如何做到这一点会更好。

那么处理这个问题的最佳方法是什么?到目前为止,我可以通过下面的代码 sn-p 将每一行读入表格行,但是 1)我不知道这是一个字符串还是数字表,2)如果我打印 tbllinesx[1],它会打印三个数字的整行。我希望能够让 tbllines[1][1]、tbllines[1][2] 和 tbllines[1][3] 对应于我的文件第一行的前 3 个数字。

local file = io.open("locations.txt")
local tbllinesx = {}
local i = 0
if file then
for line in file:lines() do
 i = i + 1
 tbllinesx[i] = line
end
file:close()
else
error('file not found')
end

【问题讨论】:

    标签: lua


    【解决方案1】:

    来自 Lua 编程https://www.lua.org/pil/21.1.html

    您可以使用多个选项调用 read;对于每个论点, 函数将返回相应的结果。假设你有一个文件 每行三个数字:

    6.0 -3.23 15e12

    4.3 234 1000001

    ... 现在您要打印每行的最大值。您可以在一次调用 read 中读取所有三个数字:

    while true do
      local n1, n2, n3 = io.read("*number", "*number", "*number")
      if not n1 then break end
      print(math.max(n1, n2, n3))
    end
    

    在任何情况下,您都应始终考虑阅读 io.read 中带有选项“*all”的整个文件,然后使用 gfind 将其分解:

    local pat = "(%S+)%s+(%S+)%s+(%S+)%s+"
    for n1, n2, n3 in string.gfind(io.read("*all"), pat) do
      print(math.max(n1, n2, n3))
    end
    

    我相信您可以自己解决如何修改它以将数字放入表格字段中。

    如果您使用三个捕获,您可以使用 table.pack 创建包含三个条目的行表。

    【讨论】:

      【解决方案2】:

      假设您的数据文件 (locations.txt) 中只有有效行,您只需更改行:

      tbllinesx[i] = line
      

      到:

      tbllinesx[i] = { line:match '(%d+)%s+(%d+)%s+(%d+)' }
      

      这会将三个以空格分隔的数字中的每一个分别放在表格中每一行的位置。

      编辑:模式中重复的%d+ 部分将需要根据您的实际输入进行调整。 %d+ 假定为纯整数,对于可能的减号 (%-?%d+) 和可能的点 (%-?%d-%.?%d+) 等等,您需要更多的参与。当然,最简单的方法是抓取所有非空格 (%S+) 作为潜在数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-12
        • 1970-01-01
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多