(use magic-pipes) (use args) (use ports) (use chicken-syntax) (use csv-string) (use csv) (use alist-lib) (receive (options operands before-exprs after-exprs usage) (parse-mp-args (command-line-arguments) (list (args:make-option (D delimiter) (required: "DELMIITER-CHAR") "Specify the delimiter character") (args:make-option (T tsv) #:none "Set the delimiter character to a tab")) "" "Read CSV from standard input, and convert each record to a list sexpr on standard output.") (unless (= (length operands) 0) (usage)) (let* ((ec (make-eval-context before-exprs '() after-exprs)) (delim-str (if (assq 'tsv options) "\t" (alist-ref options 'delimiter (lambda () ",")))) (delim (if (= (string-length delim-str) 1) (string-ref delim-str 0) (usage))) (parse (csv-parser delim))) (let loop () (let ((line (read-line))) (unless (eof-object? line) (let ((record (parse line))) (for-each (lambda (csv-line) ; There SHOULD be only one... (data-write (csv-record->list csv-line)) (newline)) record) (loop))))) (without-input-port (eval-context-end-closure ec))))