mysqldump.ss
(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)]))