vsc is a reversible csv, tsv, and fixed-with parser.

I think this can be done by wrapping univocity-parsers.

(def contents (slurp "file.csv"))

(def csv (vsc/str->cells contents))

cells
#=> [[1 2 3] ["a" "b" "c"]]

(meta cells)
#=> {:vsc/settings
     {:delimiter \;
       :eol "\n"
       :quote-char \"
       :always-quoted-cols ["date"]
       ,,,}}

(def str
  (vsc/cells->str cells
                  (-> cells meta :vsc/settings)))

(assert (= contents str))

Open questions

🎨 Prior art