在Lua中读取文件

3
英译中:

我正在为大学做一个Lua项目,但这是我第一次接触Lua,所以我不知道老师让我做的所有事情。

我需要读取一个文件,我们可以称之为“text.txt”,其中的数据是按照这样的方式组织的:

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

然后我需要把这些数据放到一个数组中,以便稍后使用。
有人知道如何做并可以帮我修改这段代码吗?

--代表什么?你能提供一个有多个条目的例子吗? - hjpotter92
@hjpotter92 重点是...我不知道,在描述中只有这个,他们没有给我一个带有多个条目的例子。我认为 -- 只是用来分隔每种类型,这意味着它是无用的。 - cfrancklin
但这也可能意味着该文件可以是此处列出的格式之一:https://pastee.org/65xyw - hjpotter92
他们告诉我会提供一个用ASCII编码的文本文件,其中每个寄存器都采用以下格式:entry { ... }。因此,我认为中间的这个是代表条目将如何呈现的那个。@hjpotter92 - cfrancklin
1个回答

4

这种格式是Lua语法的一部分,因此如果您可以使用一些库函数,那么解析它应该相对容易。

就文件格式而言: f{ ...}f({...})作为函数调用的简写。 花括号中的其余内容是注释(以--开头)和表字段(age = 20,)。

例如,上面的示例(在我们有选择的情况下使用“M”)将解析为函数调用entry({name = "John", sex = "M", age = 20}),这是有效的Lua代码,可以使用标准库中的load(string)loadfile(path函数进行解析。


要提取数据,您需要像这样做:

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

4
_ENV 的使用不正确。当执行 load(filecontents) 时,thunk 函数的 _ENV upvalue 被创建并设置为默认的 (_G);后面创建的本地 _ENV 不会影响它。应该使用 load 的第四个参数,例如 local thunk = load(filecontents, nil, nil, {entry = entry}) - mpeterv
谢谢!在5.2中处理环境已经有一段时间了。已经编辑过了。 - jgriego
@cfrancklin 为什么要将字符串拆分成行?您可以使用此答案中的代码从整个字符串中提取条目。 - mpeterv
@peterm 由于在 thunk() 上,我收到了这个错误消息: "尝试调用本地变量 'thunk'(一个空值)"。 - cfrancklin
@cfrancklin 为什么要打印 entries.nameentries 是一个数组。假设您像这样迭代它:for i,entry in ipairs(entries) do ... end,请尝试在循环内打印 entry.nameentry.sex 等。 - mpeterv
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接