Gauche で CSV 形式のデータをソートする

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
プログラミングGauche

posted with amazlet at 09.07.23
Kahuaプロジェクト
オライリージャパン
売り上げランキング: 51330
«
»