Last active
December 17, 2015 23:59
-
-
Save yamasushi/5693264 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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)) ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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