Text::CSV

Excelで作られた表を PostgreSQL で作ってあるデータベースに放り込むために、とりあえず CSV で書き出してから perl で処理。テキスト部分にダブルクオートやコンマが含まれてたりするとパースが面倒だけど、そういうところも見当たらないので、手っ取り早く split(/,/) でやっちゃおうかと思ったけど、後々のために、ちゃんとパースするようにしておこう。

ってことで、Text::CSV を使ってみたんだけど……あれ? なんか漢字の使ってある行が処理されてないぞ? その行で parse に失敗してる?

いろいろ調べてみたら、perldoc Text::CSV の最後のほうに

Allowable characters within a CSV field include 0x09 (tab) and the inclusive range of 0x20 (space) through 0x7E (tilde).

って書かれてた。そうですか。使える文字は ASCII の範囲だけですか。UTF8で書いても日本語はだめですか。そうですか orz

8bit clean な Text::CVS_XS ってのもあるのに気づいたので使ってみたけど、結局、

$csv = Text::CSV_CS->new(binary=>1);

としてバイナリが通るようにして使うってことらしい。UTF8のテキストだと、エンコードしたりデコードしたりで結構面倒。

結局 split を使いましたとさ。