-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On 8-Feb-07, at 4:03 PM, Phil Dawes wrote:
Hi Gambit List,
I needed a fast csv parser for parsing large (multi-gig) files so I've wrapped the libcsv c code by Robert Gamble[1]. The first cut of csv.scm is here: http://phildawes.net/2007/gambit-csv/0.1/csv.scm
Example usage:
(define it (csv-make-iterator fname))
(it) ; returns the first row as a list
(it) ; returns 2nd row ..etc..
; (it) returns '() when it hits the end of the file.
I'm very new to gambit/scheme - is this a reasonable interface or is there a more schemey idiom I should be presenting?
Interesting. But why would you do it in C (in 600 lines of code) when you can do it in 20 lines of Scheme?
(define (csv-make-iterator fname) (let ((port (open-input-file fname))) (lambda () (read-csv port))))
(define (read-all-csv port) (read-all port read-csv))
(define (read-csv port) (let ((line (read-line port))) (if (eof-object? line) line (split-csv line))))
(define (split-csv str) (call-with-input-string str (lambda (port) (read-all port (lambda (p) (read-line p #,))))))
(define it (csv-make-iterator "test"))
(it) => ("11" "22" "33") (it) => ("a" "b")
(call-with-input-string "11,22,33\na,b\n" read-all-csv) => (("11" "22" "33") ("a" "b"))
Marc