csv: cleanup public interface, adding stream- versions of read/write words.

db4
John Benediktsson 2013-03-14 21:18:34 -07:00
parent 91b1f3fff1
commit a5c5970530
1 changed files with 31 additions and 31 deletions

View File

@ -11,8 +11,6 @@ CHAR: , delimiter set-global
<PRIVATE
: delimiter> ( -- delimiter ) delimiter get ; inline
MEMO: field-delimiters ( delimiter -- field-end quoted-field )
[ "\n" swap suffix ] [ "\"\n" swap suffix ] bi ; inline
@ -49,33 +47,36 @@ DEFER: quoted-field
if-empty
] [ [ 2drop ] 2dip swap ?trim ] if ;
: (row) ( delimiter stream field-end quoted-field -- delimiter sep/f fields )
[ dup [ 2dup = ] ] 3dip
[ [ drop ] 3dip field ] 3curry produce ;
: (stream-read-row) ( delimiter stream field-end quoted-field -- delimiter sep/f fields )
[ dup [ 2dup = ] ] 3dip '[ drop _ _ _ field ] produce ;
: row ( delimiter -- delimiter sep/f fields )
input-stream get over field-delimiters (row) ;
: (csv) ( -- )
delimiter>
: (stream-read-csv) ( stream -- )
delimiter get
[ dup [ empty? ] all? [ drop ] [ , ] if ]
input-stream get pick field-delimiters
[ (row) ] 3curry do while drop ;
rot pick field-delimiters
'[ _ _ _ (stream-read-row) ] do while drop ;
PRIVATE>
: read-row ( stream -- row )
[ delimiter> row 2nip ] with-input-stream ;
: stream-read-row ( stream -- row )
delimiter get swap over field-delimiters
(stream-read-row) 2nip ; inline
: read-csv ( stream -- rows )
[ [ (csv) ] { } make ] with-input-stream
dup last { "" } = [ but-last ] when ;
: 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 )
<string-reader> read-csv ;
[ read-csv ] with-string-reader ;
: file>csv ( path encoding -- csv )
<file-reader> read-csv ;
[ read-csv ] with-file-reader ;
: with-delimiter ( ch quot -- )
[ delimiter ] dip with-variable ; inline
@ -95,27 +96,26 @@ PRIVATE>
[ dupd needs-escaping? ] dip
[ escape-quotes ] [ stream-write ] bi-curry if ; inline
: (write-row) ( row delimiter stream -- )
: (stream-write-row) ( row delimiter stream -- )
[ '[ _ _ stream-write1 ] ] 2keep
'[ _ _ escape-if-required ] interleave nl ; inline
PRIVATE>
: stream-write-row ( row stream -- )
delimiter get swap (stream-write-row) ; inline
: write-row ( row -- )
delimiter> output-stream get (write-row) ; inline
output-stream get stream-write-row ; inline
<PRIVATE
: stream-write-csv ( rows stream -- )
delimiter get swap '[ _ _ (stream-write-row) ] each ;
: (write-csv) ( rows -- )
delimiter> output-stream get '[ _ _ (write-row) ] each ;
PRIVATE>
: write-csv ( rows stream -- )
[ (write-csv) ] with-output-stream ;
: write-csv ( rows -- )
output-stream get stream-write-csv ;
: csv>string ( csv -- string )
[ (write-csv) ] with-string-writer ;
[ write-csv ] with-string-writer ;
: csv>file ( rows path encoding -- )
<file-writer> write-csv ;
[ write-csv ] with-file-writer ;