のっけからですが、私は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パースクラスを利用してました。(こちらはファイルからの読み込み使っていたので、文字列はどうか知りません)
Comment feed