2017年 07月の投稿を表示しています

CSV ファイルで文字化けするんだけど!!!を調べた

こんにちは、ごみばこです。

CSV ファイルってデフォルトでエクセルを使って開けるんですけど、どうにも文字コードを上手いことしてあげないとだめなんですよね。ということで幾つかの組み合わせについてぐぐったり、試したり、調べたのでメモ程度にー。
(ぐぐったらいろんな人が書いていて今更感もありますが・・・)

試したコードはこちら

<?php
// http://php.net/manual/ja/mbstring.supported-encodings.php
$encoding = [
	'UTF-8',
	'UTF-16BE',
	'UTF-16LE',
	'UTF-32BE',
	'UTF-32LE',
	'EUC-JP',
	'SJIS',
	'SJIS-win',
	'ISO-2022-JP',
	'CP932',
];

// https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF
$bom = [
	'UTF-8' => chr(0xEF) . chr(0xBB) . chr(0xBF),
	'UTF-16BE' => chr(0xFE) . chr(0xFF),
	'UTF-16LE' => chr(0xFF) . chr(0xFE),
	'UTF-32BE' => chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF),
	'UTF-32LE' => chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00),
];

$ary = ['abcdef', 'テスト', 'ほげほげ', '??'];
ob_start();
echo '"' . implode('","', $ary) . '"'; // とりあえず雑に...
$buf = ob_get_flush();

// bom なし
foreach($encoding as $e) {
	file_put_contents("{$e}.csv", mb_convert_encoding($buf, $e));
}

// bomあり版
foreach($encoding as $e) {
	if (empty($bom[$e])) {
		continue;
	}

	file_put_contents("{$e}_bom.csv", $bom[$e] . mb_convert_encoding($buf, $e));
}

寿司ビールが正しく出れば Unicode も適切に処理されているはずなので安心安全ですね!

では結果を順番に見ていきましょう。















まとめるとこんな感じですね!

・CP932 や SJIS, EUC-JP などでは案の定、寿司ビールは出ません。
・UTF では BOM ありでないと文字化けしてしまいました。
・UTF-16 では LE にする必要がありました。
・UTF-16 では他のものと異なり、自動でカンマ部分の解釈がされないようでした。
・UTF-32 はダメです。

というわけで、とりあえず UTF-8 BOM あり にしておけば、色々と安心安全に動くんじゃないかなーと思います。

または、どうしても表でほしいなら xlsx を直にいじくりまわす、ですかねー。
PHP なら phpexcel 。Java なら POI 。Python なら xlrd + pandas 。
などと様々な言語から xlsx を利用する手立てがあります(あたまの良い人ありがとう)ので、これらを使っていくことも検討すべきかと思います。まあ、つらいところもあるので、難しいものなら、そもそもいる?、なんて話にした方がいいよいかもしれませんね!

pv コマンド便利だよって

こんにちは、ごみばこです。

pv コマンド絶妙に便利なのですが、使う機会も少ないので、忘録的に書いときます。

pv ??

ivarch.com: Pipe Viewer

pv = pipe viewer の略で、その名の通り、パイプ処理のときのデータ量を可視化してくれて、絶妙に役立ちます。

pv をインストール

debian 系なら apt-get で、特に何することなくインストールするとこができます。Redhat もとい CentOS では RPMForge を導入することで yum install pv でインストールできます。

RepoForge Project

RPMForge は終了したそうです。理由としては、メンテナンスされていない古いソフトウェアが増えてきたから、とのこと。。というわけで Redhat/CentOS な方々は pv の公式サイトから rpm が公開されているので、これを利用すると良さそうです。

http://www.ivarch.com/programs/rpms/pv-1.6.6-1.x86_64.rpm

※バージョンは要確認すること。

$ sudo rpm -ivh http://www.ivarch.com/programs/rpms/pv-1.6.6-1.x86_64.rpm
$ pv --version

pv を使う

たとえば圧縮された SQL をドバーッと mysql に流したい…。

$ bzcat dump.sql.bz2 | mysql -uroot -pxxxx

が、これでは、ちゃんと進んでいるのかわからにくい! ここで pv を使うと…

$ bzcat dump.sql.bz2 | pv | mysql -uroot -pxxxx
1.81GiB 0:02:31 [ 12.4MiB/s] [                      <=>           ]

こんな出力がされ、流れるデータ量が可視化されます!

更に pv は複数に渡って記述ができるので…
(公式サイトに記載されているものとほぼ同じですが。。)

$ pv -cN source < dump.sql.bz2 | bzcat | pv -cN bzcat | mysql -uroot -pxxxx
    bzcat:  109MiB 0:00:18 [7.60MiB/s] [            <=>                     ]
   source: 52.7MiB 0:00:19 [3.89MiB/s] [=====>              ] 27% ETA 0:00:50

終わりそうな目処感と流れるデータ量を可視化できます!

まとめ

pv を使うことでパイプに流れるデータ量を観測することができます。これによっていつ終わるのか不安に思える作業もある程度は見える化されて便利~!

PhpStorm で Python のシンタックスハイライトを利用する

こんにちは、ごみばこです。

これまで SublimeText ユーザだったのですが、ここのところずっとPHP書きがおおいので、本格的に PhpStorm に乗り換えました。やっぱり IDE すごいっすねー、静的解析強力過ぎやしませんかね。

PhpStorm: Lightning-Smart IDE for PHP Programming by JetBrains

という話は今回ではないのですが。

PHP も書きつつ、機械学習だなんだーとやる機会もあって Python を書くことも増えてきました。そこで PhpStorm でも Python のハイライトくらいはできるよーって紹介です。

PyCharm があるよね?

PhpStorm と同じく JetBrain 社から PyCharm という Python 向けの IDE も出ています。が、これを使うにはまた別途ライセンスを買わないと。。そこまでガッツリと書いているわけでもないしなあ。。。ということで基本的に SublimeText を使って Python を書いています。

PyCharm: Python IDE for Professional Developers by JetBrains

ある日、ふと PhpStorm も IDE だし、プラグインかなにかでハイライトくらいはできるんじゃないの? と思い調べたところ、スルッと出来ました。ただし、できるのはハイライトまでで、静的解析やその他の言語サポートは利用できません。PhpStorm にある機能(検索、置換、etc...)ならばできます。

背景には PHP と Python とが合わさったプロジェクトをやることがあり、エディタを度々切り替えるのもなんだかなーまとめられないかなー、というところからです。

TextMate Bundles Support

TextMate はご存知でしょうか?

textmate/textmate: TextMate is a graphical text editor for OS X 10.9+

Mac 向けのテキストエディタなのですが、そのエディタで使える言語定義ファイルである tmbundle を PhpStorm はじめとした各種の JetBrain 社の IDE で利用することができます。これによりプラグインを含めて IDE がサポートしていない言語、設定ファイルなどをハイライトすることができます。

そんな機能を使うには、まず TextMate Bundles Support を有効化する必要があります。

plugins -> textmate bundles support

次に tmbundle ファイルを探します。これは TextMate オーガナイゼーションに多数あるので、そこから探すと良いでしょう。ここでは python.tmbundle をダウンロードします。

Search · org:textmate tmbundle

textmate/python.tmbundle: TextMate support for Python

このファイルは、どこかわかりやすい場所にまとめると良いでしょう。
そうして準備ができたファイルを PhpStorm で読み込みます。

settings -> editor -> textmate

このとき TextMate と PhpStorm とで、カラースキーマを合わせる設定をします。IDE Color Schema に合わせて TextMate Color Schema を設定していきます。私の場合は Monokai copy という名前で Monokai をちょっと弄ったものを使っているので、これに合わせて Monokai を選びます。(すべて Monokai になっていますが使っているテーマに合わせて、だけでよいです。)

 

以上で設定は完了です。これで Python がシンタックスハイライトされるようになりました。カッコが気持ち悪いのは autopep8 したからです。。

まとめ

PhpStorm でも TextMate Bundles Support を有効にすることで言語定義ファイルの tmbundle を利用できるようになりました。このファイルをどんどん入れていけば、他の言語もハイライトされるようになっていきます。TextMate リポジトリを見てわかるように、かなりの定義ファイルがあります。

ただ、仕事や趣味問わずですが、ガッツリと使っていく予定があるならば、言語環境にあったエディタや IDE を利用したほう生産性も上がっていくと思います。余程のエディタ愛があるならともかく、環境に合わせて使う道具も切り替えていきたいですね!

ガチで書くわけではなく、ちょっとやりたいんだよね、というくらいなら tmbundle で十分だと思います。ぜひお試しください!