2010年3月14日日曜日

PHPでCSVの処理をする(その2)

PHPでも改行を含むCSVが処理できるのはわかったが、逆に「改行を含むCSVを出力できるだろうか?」という疑問が出てくる。というのは、PerlのText::CSV_xsではCSVファイルの取り込みはできても出力ができない(と信じている)ため、普段は次のようなテクニックを使う

my @list = ( "eee\nfff", 1 );
open( my $fhOut, ">b.csv" ) || die( "can't open output file: $!" );
print $fhOut '"' . join( '","', @list ) . '"' . "\n";
close $fhOut;

結果は次の通り

"eee
fff","1"

別にこれでもいいのだが、「1」のような数字までダブルクォーテーションで囲まれてしまうのには、何となく無駄を感じてしまう。では、こんなコードではどうだろう?

use Scalar::Util( "looks_like_number" );

my @list = ( "eee\nfff", 1 );
open( my $fhOut, ">c.csv" ) || die( "Can't open result file: $!" );
print $fhOut join( ",", map{ looks_like_number ( $_ ) ? $_ : '"' . $_ . '"' } @list ) . "\n";
close $fhOut;

結果は次の通り

"eee
fff",1

期待通り「1」はダブルクォーテーションで囲まれなくなるが、怠惰なPerlプログラマには重荷である。PHPの場合はどうだろう。fputcsvを使ってみると・・・。

<?php

$abc = array( "eee\nfff", 1, );

$fh = fopen( "b.csv", "w" );
$list = fputcsv( $fh, $abc );
fclose( $fh );

?>

結果は次の通り。

"eee
fff",1

なんと数字はダブルクォーテーションで囲まれない。素晴らしい。始めてPHPに白星がついた気がする。CPANモジュールでCSVをきれいに出力するモジュールってないのだろうか?

0 件のコメント:

コメントを投稿