在 Lua 上读取文件

Posted

技术标签:

【中文标题】在 Lua 上读取文件【英文标题】:Reading a file on Lua 【发布时间】:2014-06-18 11:59:51 【问题描述】:

我正在为大学做一个 Lua 项目,但这是我第一次看到 Lua,所以我不知道老师要求我做什么。

我需要读取一个文件,我们必须说“text.txt”,它的数据是这样组织的:

entry

--
name = "John",
--
sex = "M" ou "F",
--
age = 20,
--

然后我需要将这些数据放入一个数组中,以便以后使用。

有谁知道怎么做,可以帮我写这段代码吗?

【问题讨论】:

-- 代表什么?你能举一个你有多个条目的例子吗? @hjpotter92 重点是......我不知道,在描述上只有这个,他们没有给我一个超过一个条目的例子。我认为-- 只是为了区分每种类型,这意味着它是无用的。 但这也可能意味着文件可能是这里的格式之一:pastee.org/65xyw 他们对我说,它将获得一个以 ASCII 编码的文本文件,其中每个寄存器都将采用这种格式:entry ... 。所以我认为中间的这个是代表条目将如何变化的那个。 @hjpotter92 【参考方案1】:

这种格式是 Lua 语法的一个子集,所以你应该很容易解析它,假设你被允许使用一些库函数。

就文件格式而言:f ...f(... 作为函数调用的语法糖。 大括号中的其余内容是 cmets(以-- 开头)和表字段(age = 20,

因此,例如,上面的示例(在我们可以选择的地方使用“M”)将解析为函数调用 entry(name = "John", sex = "M", age = 20),这是有效的 Lua 代码,并且可以使用函数 load(string) 或 @987654328 进行解析@ 在标准库中。


要实际提取数据,您需要执行以下操作:

local filecontents = [the contents of your file as a string]
local entries = 
do
  -- define a function that our data-as-code will call with its table
  -- its job will be to simply add the table it gets to our array. 
  local function entry(entrydata)
    table.insert(entries, entrydata)
  end

  -- load our data as Lua code
  local thunk = load(filecontents, nil, nil, entry = entry)
  thunk()


end

【讨论】:

_ENV 的用法不正确。当load(filecontents)被执行时,thunk函数的_ENV上值被创建并设置为默认值(_G);稍后创建本地_ENV 不会影响它。您应该改用 load 的第四个参数,例如local thunk = load(filecontents, nil, nil, entry = entry). 谢谢!自从我不得不在 5.2 中弄乱环境以来已经有一段时间了。已编辑。 @qu4ntumcpa 和@peterm,让我再问你一件事:我使用以下代码将字符串的每一行放入表for line in texto:gmatch("[^\r\n]+") do line = line:gsub("\n", ""); table.insert(data, line) end 的一行中,所以我把这个:@ 987654339@ 在桌子上。现在我正在尝试按名称排序并打印表格中的内容,但是当我使用table.sort(data, function(x,y) return x["name"] < y["name"] end) 时,我得到了这个:attempt to compare two nil values。我该怎么办?怎么了? @cfrancklin 为什么要将字符串拆分为行?您可以使用此答案中的代码从整个字符串中提取条目。 @peterm 因为在thunk() 我收到此消息错误:“尝试调用本地'thunk'(零值)”

以上是关于在 Lua 上读取文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在Lua中读取整个文件

怎样使用lua读取文件夹内所有文件?

无法读取Lua 5.1上的二进制文件的每个字节

lua文本读取账号密码分割登录

lua脚本读取文本每次一行 如何实现

如何在lua中读取大文件(> 1GB)?