CSV形式のファイルを扱う

説明

カンマで区切ったCSV形式の文字列をリストに変換したり、リストをCSV形式の文字列に変換する。ファイルに対してもできる。

ELIS復活祭

[戻る]

実行例

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))
)


[戻る]
inserted by FC2 system