それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PHPのCSV関数

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行ずつ読み込む。

美しくない

  1. ファイルに3行も使う時点で美しくない。
  2. 1行ずつ処理が美しくない
  3. 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

引数修正した

*1:タブ区切りをCSVと呼ぶ人が多いが、身近な例では「CSVタブ区切り」と呼んでいる。実際は、TSVと呼ぶのが正しいらしい、CSVのCはカンマのC、TSVのTはタブのTのようです。