diff options
Diffstat (limited to 'stdlib/csv.tl')
-rw-r--r-- | stdlib/csv.tl | 37 |
1 files changed, 7 insertions, 30 deletions
diff --git a/stdlib/csv.tl b/stdlib/csv.tl index 9b03f3ce..c56d2520 100644 --- a/stdlib/csv.tl +++ b/stdlib/csv.tl @@ -28,16 +28,21 @@ (defun get-csv (: (stream *stdin*)) (if (stringp stream) (upd stream make-string-input-stream)) - (enumlet (rfield qfield cr qcr quot) + (enumlet (rfield qfield quot) (let ((record (vec)) (field (str 0)) (state rfield) (done nil)) (while (not done) (let ((ch (get-char stream))) + (when (eq ch #\return) + (let ((ch2 (get-char stream))) + (if (eq ch2 #\newline) + (set ch ch2) + (if ch2 + (unget-char ch2 stream))))) (caseql* state (rfield (caseql* ch - (#\return (set state cr)) (#\newline (vec-push record field) (set done t)) (#\, (vec-push record field) @@ -52,36 +57,9 @@ (t (string-extend field ch)))) (qfield (caseql* ch (#\" (set state quot)) - (#\return (set state qcr)) (nil (vec-push record field) (set done t)) (t (string-extend field ch)))) - (cr (caseql* ch - (#\newline (vec-push record field) - (set done t)) - (#\return (string-extend field ch)) - (#\, (string-extend field #\return) - (vec-push record field) - (set field (str 0) - state rfield)) - (nil (string-extend field #\return) - (vec-push record field) - (set done t)) - (t (string-extend field #\return) - (string-extend field ch) - (set state rfield)))) - (qcr (caseql* ch - (#\newline (string-extend field ch) - (set state qfield)) - (#\return (string-extend field ch)) - (nil (string-extend field #\return) - (vec-push record field) - (set done t)) - (#\" (string-extend field #\return) - (set state quot)) - (t (string-extend field #\return) - (string-extend field ch) - (set state qfield)))) (quot (caseql* ch (#\, (vec-push record field) (set field (str 0) @@ -90,7 +68,6 @@ (set state qfield)) (#\newline (vec-push record field) (set done t)) - (#\return (set state cr)) (nil (vec-push record field) (set done t)) (t (string-extend field ch) |