使用Lua脚本解析CSV文件

3

我有一个包含以下数据的csv文件:

+12345678901,08:00:00,12:00:00,1111100,35703,test.domain.net
+12345678901,,,0000000,212,test.domain.net

我将尝试编写Lua代码,循环遍历每一行,并创建如下所示的值数组:
local mylist = {}
for line in io.lines("data/dd.csv") do
        local id, start, finish, dow, int, domain = line:match("(+%d+),(%d*:*),(%d*:*),(%d*),(%d*),(%a*.*)")
        mylist[#mylist + 1] = { id = id, start = start, finish = finish, dow = dow, int = int, domain = domain}
        print(mylist[#mylist]['id'])
end

问题在于当代码遇到起始和结束值为空的行时,正则表达式会失败,所有字段都为nil。
我以为使用*表示0或更多... 我似乎找不到我的错误/打字错误。
谢谢。

尝试将 "(%+%d+),([0-9:]*),([0-9:]*),(%d*),(%d*),(.*)" 进行匹配。 - Wiktor Stribiżew
那个可行。天啊。我从来没想过那个。 - Happydevdays
2个回答

2
这个模式对我有效:
"(.-),(.-),(.-),(.-),(.-),(.-)$"

1

看起来你只需要将数字和 : 放在一个 [...] 中:

match("(%+%d+),([%d:]*),([%d:]*),(%d*),(%d*),(.*)")
        ^       ^^^^^^   ^^^^^^     

现在,[%d:]* 匹配零个或多个数字或 : 符号。你的模式没有找到匹配,因为 %d*:* 匹配 0+ 数字后跟 0+ : 符号,并且你有超过一个这样的序列。
另外,你需要转义第一个 + 来确保它匹配一个字面上的 +
请参见 在线 Lua 演示

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