隙があればlispを詰め込んで行きたい (5)
- 平成22年7月8日(木) 16時50分29秒
- 区分
- 報告者:
- chiba
隙があればlispを詰め込んで行きたい日々ですが、今回は一つのファイルを複数ファイルに分割する仕事です。
こういうのはやっぱりsed/awkの仕事だろう、と思うのですが、一つLISPでがんばりたいところ
具体的な仕事内容ですが、
- 複数のエントリーがまとめられた、複数の長いテキストファイルを入力とする
- エントリーの区切り文字は^_
- エントリーごとに1ファイルにして出力
書き捨てな感じですが、
(dolist (file (directory "/var/tmp/foo/bar/big-*.txt"))
(dolist (mail (cl-utilities:partition-if
(mycl-util:curry #'string= "^_")
(kmrcl:read-file-to-strings file)))
(alexandria:with-output-to-file
(out (format nil "/var/tmp/result/~A" (gensym "foo-")))
(print out)
(dolist (line mail)
(write-line line out)))))
のように書いてみました。軽く解説すると、
- ファイル読み込み1行を要素とするリストにする
- PARTITION-IFでリストの中身をデリミタで1ファイル1リストとして分割する
- 分割した要素1リストを1ファイルとして出力。名前が被らないようにGENSYMで名前をつける
想像していたより短く書けたので満足です。
■