Gauche で CSV 形式のデータをソートする
2009年07月24日
Gauche でクイックソートを利用して CSV 形式のデータをソートする。
クイックソートについては、"M.Hiroi’s Home Page / お気楽 Scheme プログラミング入門" を参考にした。
この例では、CSV ファイルの読み込みは省略して、リスト化されたダミーデータを定義して使っている。
CSV ファイルの読み込みについては、"Gauche で CSV 形式のデータを読み込む"。
(use gauche.collection) ;; for partition (use srfi-13) ;; for string> ;; CSV 形式データをリストに変換したもの。 ;; port->list で CSV ファイルを読み込んでリスト化したものと仮定する。 (define dummy-csv '(("上杉謙信" "ken@foo.com" "09023421011") ("織田信長" "oda@hoge.com" "08034528761") ("徳川家康" "toku@yahoo.com" "0230989124") ("豊臣秀吉" "saru@gmail.com" "08013457812") ("毛利元就" "nari@yahoo.com" "02056720981"))) ;; クイックソート手続き (define (quick-sort comp lis) (if (null? lis) '() (let ((p (car lis))) (receive (a b) (partition (lambda (x) (comp x p)) (cdr lis)) (append (quick-sort comp a) (cons p (quick-sort comp b))))))) ;; CSV 形式データの col-num 番目のセルを比較してソートする。 (define (quick-sort-csv comp lis col-num) (quick-sort (lambda (lis-x lis-y) (let ((x (list-ref lis-x col-num)) (y (list-ref lis-y col-num))) (if (comp x y) #t #f))) lis))
実行結果
(quick-sort-csv string> dummy-csv 0) gosh> (("豊臣秀吉" "saru@gmail.com" "08013457812") ("織田信長" "oda@hoge.com" "08034528761") ("毛利元就" "nari@yahoo.com" "02056720981") ("徳川家康" "toku@yahoo.com" "0230989124") ("上杉謙信" "ken@foo.com" "09023421011")) (quick-sort-csv string> dummy-csv 1) gosh> (("徳川家康" "toku@yahoo.com" "0230989124") ("豊臣秀吉" "saru@gmail.com" "08013457812") ("織田信長" "oda@hoge.com" "08034528761") ("毛利元就" "nari@yahoo.com" "02056720981") ("上杉謙信" "ken@foo.com" "09023421011")) (quick-sort-csv string> dummy-csv 2) gosh> (("上杉謙信" "ken@foo.com" "09023421011") ("織田信長" "oda@hoge.com" "08034528761") ("豊臣秀吉" "saru@gmail.com" "08013457812") ("徳川家康" "toku@yahoo.com" "0230989124") ("毛利元就" "nari@yahoo.com" "02056720981")) (quick-sort-csv string> dummy-csv 3) gosh> *** ERROR: argument out of range: 3 Stack Trace:
プログラミングGauche
posted with amazlet at 09.07.23
Kahuaプロジェクト
オライリージャパン
売り上げランキング: 51330
オライリージャパン
売り上げランキング: 51330