アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

隙があればlispを詰め込んで行きたい (5)

隙があればlispを詰め込んで行きたい日々ですが、今回は一つのファイルを複数ファイルに分割する仕事です。
こういうのはやっぱりsed/awkの仕事だろう、と思うのですが、一つLISPでがんばりたいところ
具体的な仕事内容ですが、

  1. 複数のエントリーがまとめられた、複数の長いテキストファイルを入力とする
  2. エントリーの区切り文字は^_
  3. エントリーごとに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. ファイル読み込み1行を要素とするリストにする
    2. PARTITION-IFでリストの中身をデリミタで1ファイル1リストとして分割する
    3. 分割した要素1リストを1ファイルとして出力。名前が被らないようにGENSYMで名前をつける
    4. </ol> という風にしてみました。
      想像していたより短く書けたので満足です。