PHPにはfputcsv/fgetcsv関数がある。WEB+EBバックナンバーを読んでいたらで、オススメめ関数と紹介されていた。早速使ってみた
fputcsvの利用
<?php $fp = fopen("csvtest.txt", "w"); foreach( $lines as $line ){ fputcsv( $fp , $line ); }
クオート、カンマを考慮した処理を行ってくれるのが嬉しい。
fgetcsv関数の利用
<?php $line = fgetcsv( "csvtest.txt" ); var_dump( $lines );
fgetcsvは1行ずつ読み込む。
美しくない
- ファイルに3行も使う時点で美しくない。
- 1行ずつ処理が美しくない
- var_export+file_put_contentsした方がらく。
file_put_contentsで同じようなことをする
ファイルに一時的に書出すだけならこの方が楽か
<?php #書き込み file_put_contents("hoge.txt", serialize($lines)); #読み出し $lines = unserialize( file_get_contents("hoge.txt") );
CSV/TSV形式がいいよね
CSV/TSV*1をつかってファイルをやり取りしたり、閲覧する方が業務上便利なことが多い。やっぱりCSVを使うことになった。でもfile_put_contentsに比べたらずいぶん不便だ。
file_put_csv/file_get_csvを考えた
たぶん車輪の再発明だろうけど。いちおう作ってみよう。2次元配列を一気にファイルにおとしこむ。その逆でファイルから一気に2次元配列に読み込んでくる関数。
file_put_csv
<?php ///2次元配列とCSVを一括変換する関数 function file_put_csv( $filename,$lines, $file_mode="w", $delim=",", $enclosure="\"" ) { $fp = fopen( $filename, $file_mode ); $state =null; foreach( $lines as $idx => $line ){ $state = fputcsv( $fp, $line, $delim, $enclosure ); } return $state; }
これで2次元配列をCSVへ変換できる。区切り文字をTABに変えるとTSVになる。
file_get_csv
<?php //CSVを2次元配列に一括変換する関数 function file_get_csv($filename, $length=null,$delim=",",$enclosure="\"") { $data = array(); $fp = fopen($filename,"r"); while( ($buff=fgetcsv($fp,$length,$delim,$enclosure)) !==FALSE ){ $data[]=$buff; } return $data; }
これで、CSVをいっきに配列に読み込むことが出来る。
<?php //実行例 // a.csv //a,b,c //1,2,3 //4,5,6 $data = file_get_csv("a.csv"); var_dump($data);
array(3) { [0]=> array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" } [1]=> array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" } [2]=> array(3) { [0]=> string(1) "4" [1]=> string(1) "5" [2]=> string(1) "6" }
すこしは便利になったかも。
file_getcontentsのように、一気にArrayへCSVを落とせるので記述がスッキリして嬉しい。これらの関数を使うと、冒頭の処理が3行ー>1行になりループもなくなりスッキリ。
2014-05-22
引数修正した