のっけからですが、私はCSVというデータフォーマットが嫌いです。
古くから使われていながら標準仕様がない。
にも、かかわらず、ユーザーはまるで標準の仕様があるかのように扱う。
挙句、変種の「K3」などというフォーマットが現れたりして、、、
最終的に、後追いみたいな形でRFC4180として仕様が成文化。
(それでもまだ、ほぼ、ソフトウェアによって仕様はいまいち固まらない)
 
というような状況があって、結構CSVを読み書きするシステムを作るのは、
意外に負担だったりします。
 
まぁ僕の場合は、「エクセルのCSV以外は知らん」という立場で作ることにしていますが。
 



 
前置きが長くなりました。今回そんなCSV(文字列)をPHPで初めて扱うことに。もう結構長い間PGやってますけど、よく考えたらPHPでCSV形式の文字列を扱うのは初めてだったんです。(間違えないでくださいね。ファイルじゃないですよ。文字列です。)
 
Perlではこちらのサイトを参考によくやってました。
ほとんどがこれで対応できてました。
 
一方PHPは、fgetcsv()ってのを使うんですね。
で、これファイルハンドルの読み込み用の関数なんですね。
 
今回はファイルからの読み込みでなく、
CSVフォーマットの文字列を配列に変換する必要があったので、
これじゃ駄目だってことで探したら str_getcsv() ってのがあったんですが、
これがPHP5.3.0以降専用。
 
うわっ。。。PEARをよく使う私にとって現段階ではPHP5.3.0以降は鬼門です。
(オブジェクトの作成方法などが厳密になって、
 PHP4系統での利用を保証しているPEARライブラリを利用すると
 エラー連発で使い物にならないのです。。。)
 
うぅ、、、どうしようか、、、
ということで、仕方ない、一時ファイルをつくってfgetcsv()で読むというロジックでやることに。
幸いPHPにはtmpfile()という一時ファイル用の関数がある。
 
ということで、関数を作りました。

function getArrayFromCSVFormat( $str ){
$parseData = array();
$fh = tmpfile();
fputs( $fh, $str );
fseek( $fh, 0, SEEK_SET );
while( $row = fgetcsv( $fh ) ){
$parseData[] = $row;
}
fclose( $fh );
return $parseData;
}
活用する場所があるか不明ですが、
使いたい人はご自由に。
 
あ、あと、このサンプルでは、
fgetcsv()のオプション引数は設定してませんので、
必要があれば設定してください。
また、fgetcsv()は古いバージョンのPHPだとバグだらけで泣けます。
その時は、別の方法をお試しください。。。
 
 
ちなみに私はPHP5.1系統のころまで、こちらで配布されているPHPパースクラスを利用してました。(こちらはファイルからの読み込み使っていたので、文字列はどうか知りません)

トラックバック

このブログ記事に対するトラックバックURL:

コメント & トラックバック

コメントはまだありません。

Comment feed

コメントする