diff --git a/src/parsers/date-format.lisp b/src/parsers/date-format.lisp index 35014ba..8ce699f 100644 --- a/src/parsers/date-format.lisp +++ b/src/parsers/date-format.lisp @@ -35,8 +35,15 @@ &allow-other-keys) (loop :for (name start end) :in format + :for ragged-end := (when end + (cond ((member name '(:msecs :usecs)) + ;; take any number of digits up to + ;; the specified field lenght + ;; (less digits are allowed) + (min end (length date-string))) + (t end))) :when (and start end) - :append (list name (subseq date-string start end))) + :append (list name (subseq date-string start ragged-end))) (if (or (string= year "0000") (string= month "00") (string= day "00")) @@ -91,7 +98,7 @@ microseconds noise))) -(defrule noise (+ (or #\- #\. #\Space #\* #\# #\@ #\/ #\\ "T")) +(defrule noise (+ (or #\: #\- #\. #\Space #\* #\# #\@ #\/ #\\ "T")) (:lambda (x) (incf *offset* (length (text x))) nil)) (defrule year (or year4 year3 year2)) diff --git a/test/csv-parse-date.load b/test/csv-parse-date.load index 576d939..8448db1 100644 --- a/test/csv-parse-date.load +++ b/test/csv-parse-date.load @@ -3,7 +3,7 @@ LOAD CSV ( "row num", ts [date format 'YYYY-MM-DD HH24-MI-SS.US'], - hr [date format 'HH24.MI.SS'] + hr [date format 'HH24:MI.SS'] ) INTO postgresql:///pgloader?dateformat ("row num", ts, hr) @@ -25,6 +25,6 @@ LOAD CSV ); $$; -1,1999-10-02 00-33-12.123456,"00.05.02" -2,2014-10-02 00-33-13.123456,"18.25.52" -3,2014-10-02 00-33-14.123456,13.14.15 +1,1999-10-02 00-33-12.123456,"00:05.02" +2,2014-10-02 00-33-13.123,"18:25.52" +3,2014-10-02 00-33-14.1234,13:14.15