カンマで区切ったCSV形式の文字列をリストに変換したり、リストをCSV形式の文字列に変換する。ファイルに対してもできる。
csv2list: CSV形式の文字列をリストに変換 list2csv: リストを文字列に変換。
csv-to-list: CSV形式のファイルをリストに変換 list-to-csv: リスト形式のファイルを文字列に変換。
fsort: CSV形式のファイルの先頭でソートする。
Tao>(csv2list "無,芸,大,食") Tao>(list2csv '("無" "芸" "大" "食")) Tao>(csv-to-list "text.csv") Tao>(list2csv "list.s") Tao>(fsort 'string-lessp "in.csv" "out.csv")
;
; CSV形式の文字列をリストにして返す csv2list.tao
;
; TAO mode
; IDATEN/K.Takeshita
; 91/01/07 ( csv2list csv-to-list list2csv )
; 91/01/08 ( list-to-csv fsort )
;
(de csv2list( str &aux p )
( if ( null (!p (smemq-case "," str)) ) (list str)
( cons (substring str 0 p) (csv2list (substring str (+ p 1))) )
)
)
;(de csv-to-list( fp &aux str )
; ( if ( eq (!str (read-line fp)) :eof ) ()
; ( cons (csv2list str) (csv-to-list fp))
; )
;)
(de csv-to-list ( fp )
( loop (&aux s c) (:init (!c 'nil))
(if (eq (!s (read-line fp)) :eof) (return c)
(!c (cons (csv2list s) c) )
)
)
)
(de list2csv( l )
( if ( eq (length l) 1 ) (car l)
( string-append (car l) "," (list2csv (cdr l)))
)
)
(de list-to-csv( fp li )
( mapc (lambda (x) (write-line (list2csv x) fp)) li )
)
(de fsort( func infile outfile )
(let ( (in (open infile)) (out (open outfile :direction :output)) )
(list-to-csv out (sortcar (csv-to-list in) func ))
(close in) (close out)
)
)
練習で作ったやつ。
;
; 文字列をデリミタ単位でアトムにする
; tao mode 90/07/06 sep2-delimited by Idaten
; 07/10 sep-delimited
; 07/11 app-delimited
;
(de sep2-delimited (x)
(if (!y (string-search-case "," x))
(list (substring x 0 y) (substring x (+ 1 y)))
x)
)
(de sep-delimited (x &aux y)
(if (!y (string-search-case "," x))
(cons (substring x 0 y) (sep-delimited (substring x (+ 1 y))))
(list x ) )
)
(de app-delimited (x)
(if (> (length x) 1)
(string-append (car x) "," (app-delimited (cdr x)))
(car x))
)