久しぶりにSJISファイルなんか変換しちゃったりして、しかもそれが1Gのファイルで1000万件ある。
普段オープン系のプログラマでは日常的な文字コード変換かもしれない。
カチャカチャッターン流では
"1Gのshit-jis で日本語 の織り交ざったテキストファイルを、文字コードをutf-8にしてひらがな部分を全角カタカナに統一する"のをワンライナーでやりきってみた。
(最後の tr- d は理論上不要なのにオマジナイとしてあると幸せかもしれない)
zcat textfile.gz | nkf -w -Z -Lu --katakana | tr -d "\r" > result.txt
ワンライナーとはいえ、準備で何回かッターン!ッターン!して周囲をイラつかせた、おまじないが必要な理由が知りたい人は下へ読み進んでほしい。
nkf 先生の登場
久しぶりに使ったら、7系にはyum にないんだって
Amazon Linux AMI 2015.09.1 (HVM)
親切な方のメモから、6系のパッケージで問題ないとのこと。
sudo yum localinstall -y http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86_64.rpm
オプションですべて事足りるはずだった。
utf に出力する
-w
都合により、全角カタカナに統一
--katakana
改行は UNIX(LF)
-Lu
英数字を半角に変換
-Z4
結果、やんちゃっぷりを発揮してくれた
- もともとはわりと色々な記号や全角半角があったSHIFT-JIS(分かち書きしてあったはず。。)
- nkfのみの変換の結果、改行でないところにCRが途中に混入していたりして?。。元ファイルをみても変な文字はない。改行コードもLFに変換指定しているので、バグ?
- でもそのファイルを使用するとプログラムがエラーになる。
- rU (universal new Line ) にしてもエラーになるので最後の手段
おまじないが効いた
だいたい、CR 改行文字があるよ、って言われるので(抜いてるはずなのに)
sed でやってみたりしたけど、なぜか引っかからない
tr -d "\r"
これで最強だった.
副産物
PHPだったら、たしか変な変換はしないよね、とおもって確かめてみたかったときに、パイプでコマンドラインから 巨大なgzファイルの最初の10行を開いて、1行ずつ パイプで標準入力を処理するHACKを閃いた
sudo yum install -y php php-mbstring
これでphp.iniにもすでにmbstringが有効になってるので、なにもせずに下記のコマンド。
zcat filename.gz | head | php -r ' echo mb_convert_kana( fread(STDIN, 4096)))'
4096バイトしか読むことができないけど、1行にそんなにないので、おもむろにfread に渡す
gz を開かないまま色々としたい時にちょっと便利