! Copyright (C) 2007, 2008 Phil Dawes, 2013 John Benediktsson ! See https://factorcode.org/license.txt for BSD license. USING: combinators io io.files io.streams.string kernel make math namespaces sequences sequences.private unicode ; IN: csv SYMBOL: delimiter CHAR: , delimiter set-global : stream-read-row ( stream -- row ) delimiter get tuck field-delimiters (stream-read-row) nip ; inline : read-row ( -- row ) input-stream get stream-read-row ; inline : stream-read-csv ( stream -- rows ) [ (stream-read-csv) ] { } make dup ?last { "" } = [ but-last ] when ; inline : read-csv ( -- rows ) input-stream get stream-read-csv ; inline : string>csv ( string -- csv ) [ read-csv ] with-string-reader ; : file>csv ( path encoding -- csv ) [ read-csv ] with-file-reader ; : with-delimiter ( ch quot -- ) [ delimiter ] dip with-variable ; inline : stream-write-row ( row stream -- ) delimiter get swap (stream-write-row) ; inline : write-row ( row -- ) output-stream get stream-write-row ; inline : stream-write-csv ( rows stream -- ) delimiter get swap '[ _ _ (stream-write-row) ] each ; : write-csv ( rows -- ) output-stream get stream-write-csv ; : csv>string ( csv -- string ) [ write-csv ] with-string-writer ; : csv>file ( rows path encoding -- ) [ write-csv ] with-file-writer ;