在 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 上读取文件的主要内容,如果未能解决你的问题,请参考以下文章