Comment detail

RFC 4180対応版 CSVレコードの分解 (Nested Flatten)
 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
")
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 #\,))))
どうも、勉強になります。

Index

Feed

Other

Link

Pathtraq

loading...