RFC 4180対応版 CSVレコードの分解
Posted feedbacks - Scheme
1 2 3 4 5 6 7 8 9 10 11 12 13 | (use text.csv)
(use srfi-42)
(define (parse-csv line)
(call-with-input-string line
(lambda (port) ((make-csv-reader #\,) port))))
(define (splitCSV line)
(do-ec (: elt (parse-csv line))
(: i 1)
(format #t "~a => ~a~%" i elt)))
(splitCSV "\"aaa\",\"b
bb\",\"ccc\",zzz,\"y\"\"Y\"\"y\",xxx
")
|
1 2 3 4 5 6 7 8 9 10 11 12 13 | (use text.csv)
(define (splitCSV str)
(define (numberling l)
(let loop ((l l) (n 1))
(unless (null? l)
(format #t "~d => ~a~%" n (car l))
(loop (cdr l) (+ n 1)))))
(call-with-input-string str
(lambda (in)
(port-for-each
(pa$ numberling)
(pa$ (make-csv-reader #\,) in)))))
|
call-with-input-stringには「portを引数に取る手続き」であれば何でも渡せるので、 (make-csv-reader #\,) の結果をそのまま渡すことができます。 lambdaにくるむ必要はありません。 それから、単純なインデックスつきループであれば for-each-with-indexというのがあります。 なので、こんなふうに書けます:
1 2 3 4 5 6 | (use text.csv)
(use gauche.sequence)
(define (splitCSV line)
(for-each-with-index (cut print <>" => "<>)
(call-with-input-string line (make-csv-reader #\,))))
|
おっと、カラムの表示は1からスタートでしたか。そしたらcutは使えないですね。
1 2 3 4 5 6 7 | (use text.csv)
(use gauche.sequence)
(define (splitCSV line)
(for-each-with-index
(lambda (i e) (print (+ i 1)" => "e))
(call-with-input-string line (make-csv-reader #\,))))
|




raynstard
#3389()
Rating1/1=1.00
[ reply ]