■2008-10-22
* [Perl] Text::CSVの拡張、Text::CSV::Encoded
久しぶりに新しいモジュールをCPANにアップしました。Text::CSV::Encodedです。基本はText::CSVですが、文字コードの変換も引き受けてくれます。
$csv = Text::CSV::Encoded->new ({ encoding_in => "cp932", encoding_out => "utf8", });
みたいにやっておくと、後はparse/getline/getline_hr
ではCSV文字列をencoding_inとしてdecode
します。反対にcombine/print
では出力CSV文字列をencoding_outでencode
します。parse/getline
で得たデータリストをUnicodeにしたくない、あるいはcombine/print
に渡すリストはUnicodeではないぞ、という場合は下記のようにします。
$csv->encoding('euc-jp');
変換エンジンは標準でEncode
モジュールを使っていて単純にencodingを指定するだけですが、Encode::Guessにもある程度対応しています。
$csv->coder_class('Text::CSV::Encoded::Coder::EncodeGuess'); $csv->encoding( ['ucs2', 'ascii'] ); $csv->print( \@fields ); # Microsoft Excelからのデータ
これらは当然Perl5.8以降での利用を前提としていますので、古いPerlで使うにはT::C::E::Coder::Jcode
やらT::C::E::Coder::UnicodeString
などを自力で作る必要があります(Jcodeの例はT::C::E::Coder::Baseのドキュメントで触れています)。あとおまけ機能として
$uni_columns = $csv->decode( 'euc-jp', $csv_line ); $csv_line = $csv->encode( 'euc-jp', $uni_columns );
というふうにEncodeチックに使うこともできます。