анализирайте 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