【问题标题】:Parsing large .txt files in Lua without tables在没有表的 Lua 中解析大型 .txt 文件
【发布时间】:2013-07-23 15:17:07
【问题描述】:

我对 Lua 相当陌生,尽管我使用过其他类似的语言。到目前为止,我已经花了 8 个小时试图解析一个大文本文件,但无济于事。

有问题的文件看起来像这样:(但有数千行)

A|KLAX|LOS ANGELES INTERNATIONAL|33942522|-118407161|125

我已经让用户输入 KLAX 变量,但我的目标是在不使用表格的情况下退出有问题的行的这一部分:33942522|-118407161

例如

APTDEP_DATA = 33942522|-118407161

或者甚至从 .txt 文件中取出一整行作为字符串?

例如

APTDEP_DATA = A|KLAX|LOS ANGELES INTERNATIONAL|33942522|-118407161|125

提前致谢。 8 小时后,很高兴知道我正在尝试做的事情是否可能。 (我看到的每个教程都是将数据解析成表格)

为此我尝试了很多方法:

NZAA 也是我试图找到的代码。所以不要对 KLAX 的事情感到困惑。我只是想得到一个结果。

(我无法正确显示代码,抱歉链接)

【问题讨论】:

  • 您是否尝试过使用io.lines()
  • 你花了8个小时,你竟然没想到read the documentation
  • 是的,我尝试过使用 io.lines(),是的,我确实阅读了文档……8 小时后,你一定是个白痴吧……
  • 我不太清楚你遇到了什么问题。您能否添加更多详细信息,说明您已尝试过哪些内容以及哪些内容不适合您?
  • 尝试上传我的一些不起作用的代码,但是我只是在让它正确显示时遇到了一些麻烦。

标签: parsing lua lua-table


【解决方案1】:

通过查看您的示例 sn-p,问题来自您的使用:

AP_LAT = string.match(file, "A|NZAA")

模式匹配是在字符串值上执行的,不是file句柄。更合适的是:

AP_LAT = string.match(line, "A|NZAA")

以下内容一次处理您的输入文件一行,并将其解析为相应的字段:

file = assert(io.open("Airports.txt", "r"))

for line in file:lines() do
  local fields = { line:match "(%w+)|(%w+)|([%w ]+)|([%d-]+)|([%d-]+)|([%d-]+)" }
  -- do something useful with it
  print(fields[4], fields[5])  -- the 2 numeric fields you're interested in
end

file:close()

如果您坚持没有表格,您可以将匹配项放入变量中,如下所示:

local first, second, third, etc = line:match "(%w+)|(%w+)|([%w ]+)|([%d-]+)|([%d-]+)|([%d-]+)"

注意:随意修改/优化模式以满足您的需求。这只是一个例子来说明这个想法。

【讨论】:

  • 呃,在这种情况下,最好不要使用表,因为它是静态结构,没有理由产生表创建开销。
  • 谢谢!这使它变慢了,但那是因为我每帧运行一次。至少我知道我的电脑实际上正在搜索它。在您的示例中,字段值是否必须本地化?再次感谢!
  • @user2609216 您可以通过删除 local 关键字使 fields 全局化,但将变量范围限制在需要的位置被认为是一种很好的编码实践。对于较长的脚本,将所有内容放在全局范围内会增加名称冲突的可能性。你可能会不小心覆盖了一些你不想这样做的东西。
  • 非常感谢您的帮助,但它似乎仍然无法正常工作,例如我有这个: (%w+)|(%w+)|([%w ]+)|([ %d-]+)|([%d-]+)|([%d-]+) 但是第二个 (%w+) 需要搜索 可以变成: "(%w+)|NZAA|( [%w ]+)|([%d-]+)|([%d-]+)|([%d-]+)"
  • @user2609216 为什么不在外部文件中编写脚本以使用命令行 Lua 运行它。然后你可以在那里调试它,排除故障,最后将它集成到你的程序中。
【解决方案2】:

要从文件中读取行,请使用io.lines:

for line in io.lines(filename) do 
    --do some processing
end

要从行中获取特定部分,请使用模式匹配。我不确定你想从这个问题中得到什么。

【讨论】:

  • 我发现 io.lines 上的文档非常模糊。 io.lines 只是搜索单行还是所有行?你还需要前面的 io.open 吗?我试图提取任何信息并将其显示在软件(模拟器)中,但没有从以下内容中提取任何信息:APTDEP_DATA = string.match。我什至尝试了string.find。我认为我的一半问题是我没有任何示例,因为在任何问题或教程中都没有人试图以我必须的方式获取信息。我看到了类似的东西:打印并且这些命令在 sim 中不起作用。
  • @user2609216 io.lines 每次处理一行,这就是它与for 循环一起使用的原因。使用io.lines 不需要先打开文件,但使用file:lines 可以。
  • 谢谢,我一定会试试的。
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 2021-01-11
  • 2020-10-02
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多