LoginSignup
8
8

More than 5 years have passed since last update.

1000万件のSHIFT-JISのやんちゃさんをコマンドラインだけでUTF-8に文字処理する

Posted at

久しぶりに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 を開かないまま色々としたい時にちょっと便利

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8