diff --git a/basis/csv/csv-tests.factor b/basis/csv/csv-tests.factor index 50bc3836f5..6ba8e2d5b8 100644 --- a/basis/csv/csv-tests.factor +++ b/basis/csv/csv-tests.factor @@ -7,9 +7,6 @@ IN: csv.tests : named-unit-test ( name output input -- ) unit-test drop ; inline -! tests nicked from the wikipedia csv article -! http://en.wikipedia.org/wiki/Comma-separated_values - "Fields are separated by commas" [ { { "1997" "Ford" "E350" } } ] [ "1997,Ford,E350" csv ] named-unit-test @@ -90,3 +87,5 @@ IN: csv.tests { { "writing,some,csv,tests" } } dup "csv-test2-" unique-file utf8 [ csv>file ] [ file>csv ] 2bi = ] unit-test + +[ { { "hello" "" "" "" "goodbye" "" } } ] [ "hello,,\"\",,goodbye," csv ] unit-test diff --git a/basis/csv/csv.factor b/basis/csv/csv.factor index 152b3dcbba..5902999a76 100755 --- a/basis/csv/csv.factor +++ b/basis/csv/csv.factor @@ -46,13 +46,15 @@ DEFER: quoted-field ( -- endchar ) : (row) ( -- sep ) field , - dup delimiter get = [ drop (row) ] when ; + dup delimiter> = [ drop (row) ] when ; : row ( -- eof? array[string] ) [ (row) ] { } make ; : (csv) ( -- ) - row harvest [ , ] unless-empty [ (csv) ] when ; + row + dup [ empty? ] all? [ drop ] [ , ] if + [ (csv) ] when ; PRIVATE> @@ -60,7 +62,8 @@ PRIVATE> [ row nip ] with-input-stream ; : csv ( stream -- rows ) - [ [ (csv) ] { } make ] with-input-stream ; + [ [ (csv) ] { } make ] with-input-stream + dup peek { "" } = [ but-last ] when ; : file>csv ( path encoding -- csv ) csv ;