разобрать csv с помощью lua-скрипта

У меня есть файл 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

Проблема в том, что когда код попадает в строку с пустыми значениями для начала и конца, регулярное выражение завершается ошибкой, и все поля равны нулю.

Я думал, что использование * означает 0 или больше... Я не могу найти свою ошибку/опечатку.

Спасибо.


person Happydevdays    schedule 06.10.2016    source источник
comment
Попробуйте "(%+%d+),([0-9:]*),([0-9:]*),(%d*),(%d*),(.*)"   -  person Wiktor Stribiżew    schedule 06.10.2016
comment
это сработало. шиш. я бы никогда не подумал об этом   -  person Happydevdays    schedule 06.10.2016


Ответы (2)


Кажется, вам просто нужно сгруппировать цифры и : внутри [...]:

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

Теперь [%d:]* соответствует нулю или более цифрам или : символам. Ваш шаблон не нашел совпадения, потому что %d*:* соответствует 0+ цифрам, за которыми следует 0+ : символов, и у вас было более 1 такой последовательности.

Кроме того, вам нужно экранировать первый +, чтобы убедиться, что он соответствует буквальному +.

См. демонстрацию Lua в Интернете.

person Wiktor Stribiżew    schedule 06.10.2016

Этот шаблон работает для меня:

"(.-),(.-),(.-),(.-),(.-),(.-)$"
person lhf    schedule 07.10.2016