テキストファイルから一部分を取り出すプログラム

文字エンコーディングと改行コードを適切に変換するようにし、さらになるべく省メモリか高速になる書き方をしたらかなり可読性の低いコードになった……。


具体的には下記のような処理をするようにした。

  1. テキストファイルをバイナリとして開き、先頭1KBくらいから文字エンコーディングを判別する。
  2. 正規表現を用いて先頭1KBに取り出したい文字列があるか調べる。あれば取り出す。
  3. 先頭1KBに無い場合、先頭2KBに取り出したい文字列があるか調べる。あれば取り出して7へ。
  4. 先頭2KBに無い場合、先頭4KBに取り出したい文字列があるか調べる。あれば取り出して7へ。
  5. 先頭4KBに無い場合、先頭8KBに取り出したい文字列があるか調べる。あれば取り出して7へ。
  6. 同様に倍々で検索範囲を拡げて調べる。あれば取り出す。
  7. 取り出した文字列の改行コードがCRLFではない場合、CRLFに置換する。

ブロック単位で順に読み取るほうが効率的だが、UTF-8のような可変長バイト文字がブロック境界でちぎれる可能性がある気がしたので避けた。
改行コードの置換などの文字列操作をするので、取り出した文字列の格納にはString型ではなくStringBuilderクラスを使う。
こうしないと巨大なテキストファイルを扱うときにとても遅い。