Skip to content

Instantly share code, notes, and snippets.

@yamasushi
Last active December 17, 2015 23:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yamasushi/5693264 to your computer and use it in GitHub Desktop.
Save yamasushi/5693264 to your computer and use it in GitHub Desktop.
; gsplit
(define-module csv.gsplit
(use gauche.generator)
(export
gsplit-record
gsplit-field )
)
(select-module csv.gsplit)
; gsplit-record : record splitter
; terminator? ... record terminator?
(define (gsplit-record terminator? g)
(define (gmain)
(let1 e (g)
(cond
[(eof-object? e) (set! gmain null-generator) (eof-object) ]
[(terminator? e) null-generator ] ; null record
[else
(set! g (gcons* e g)) ; push back
(letrec [[rg (^[]
(let1 e (g)
(cond [(eof-object? e)
(set! gmain null-generator)
(set! rg null-generator)
(eof-object) ]
[(terminator? e)
(set! rg null-generator)
(eof-object) ]
[else e ] ) ) ) ]]
(^[] (rg) ) ) ] ; record generator
) ) )
(^[] (gmain)) )
; gsplit-field : csv like field splitter
; separator? ... is element separator?
; quote? ... is element quote?
; skip? ... skip element?
; quoted-gen ... quoted generator
(define (gsplit-field separator? quote? skip? g)
(define (gmain)
(set! g (gdrop-while skip? g))
(let1 e (g)
(cond
[(eof-object? e) (set! gmain null-generator) null-generator ]
[(separator? e) null-generator ] ; null record
[(quote? e) ; quoted generator
(letrec [[qg (^[]
(let1 e (g)
(cond [(eof-object? e) (error "unterminated quoted field")]
[(quote? e)
(let1 e (g)
(if (quote? e)
e
(begin ; end of quoted generator
(set! g ($ gdrop-while (complement separator?) $ gcons* e g))
(g) ; drop separator
(set! qg null-generator)
(eof-object) ) ) ) ]
[else e ] ) ) ) ] ]
(^[] (qg) ) ) ]
[else
(set! g (gcons* e g)) ; push back
(letrec [[uqg (^[]
(let1 e (g)
(cond [(eof-object? e)
(set! gmain null-generator)
(set! uqg null-generator)
(eof-object) ]
[(separator? e)
(set! uqg null-generator)
(eof-object) ]
[else e ] ) ) ) ]]
(^[] (uqg) ) ) ] ; unquote generator
) ) )
(^[] (gmain)) )
#!/usr/bin/env gosh
;;; -*- mode: scheme; coding: utf-8 -*-
;;(use csv.csv :prefix test:)
(use text.csv)
(use csv.gsplit)
(use gauche.generator)
(define (read-csv sep quo port)
($ generator->list
$ gmap ($ generator->list
$ gmap ($ list->string $ generator->list $)
$ gsplit-field ($ eqv? sep $) ($ eqv? quo $) char-whitespace? $)
$ gsplit-record ($ eqv? #\newline $) $ port->char-generator port) )
(define sep #\,)
(define quo #\")
(define reader (make-csv-reader sep quo))
(define line ",,foo\nbar,\n\n")
#?=(read-csv sep quo (open-input-string line) )
#?=(port->list reader (open-input-string line) )
(exit)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment