(module mysqldump mzscheme (require (all-except (planet "list.ss" ("dherman" "list.plt" 1 0)) any) (planet "csv.ss" ("neil" "csv.plt" 1 1)) (planet "csv-write.ss" ("dherman" "csv-write.plt" 1 2)) (planet "io.ss" ("dherman" "io.plt" 1 6)) (lib "contract.ss") (lib "etc.ss")) (define csv-spec '((separator-chars . (#\,)) (quote-char . #\') (quote-doubling-escapes? . #t) (strip-leading-whitespace? . #t) (strip-trailing-whitespace? . #t))) (define (sql-escapes->csv-escapes s) (regexp-replace* #rx"\\\\(.)" (regexp-replace* #rx"\\\\\"" (regexp-replace* #rx"\\\\t" (regexp-replace* #rx"\\\\n" (regexp-replace* #rx"\\\\r" (regexp-replace* #rx"\\\\r\\\\n" s "\n") "\n") "\n") "\t") "\"") "\\1\\1")) (define (extract table dump-in) (let* ([rx (regexp (format "^INSERT INTO ~a VALUES \\(" table))] [lines (read-lines dump-in)] [relevant (filter (lambda (line) (regexp-match rx line)) lines)] [csv-lines (map (lambda (line) (sql-escapes->csv-escapes (regexp-replace rx (regexp-replace #rx"\\);[ \r\n\t]*$" line "") ""))) relevant)] [make-reader (make-csv-reader-maker csv-spec)]) (map (lambda (line) ((make-reader line))) csv-lines))) (define mysqldump->csv (opt-lambda (table [in (current-input-port)] [out (current-output-port)]) (write-table (extract table in) out))) (provide/contract [mysqldump->csv ((string?) (input-port? output-port?) . opt-> . any)]))