隙があればlispを詰め込んで行きたい日々ですが、今回は一つのファイルを複数ファイルに分割する仕事です。
こういうのはやっぱりsed/awkの仕事だろう、と思うのですが、一つLISPでがんばりたいところ
具体的な仕事内容ですが、
- 複数のエントリーがまとめられた、複数の長いテキストファイルを入力とする
- エントリーの区切り文字は^_
- エントリーごとに1ファイルにして出力
</ol>
というところです。
書き捨てな感じですが、(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で名前をつける </ol> という風にしてみました。
想像していたより短く書けたので満足です。
■