2008年04月13日
PHP Tips (3) - PHPでのCSVの読み込み
【難易度:中】
PHPでCSVを操作するにはfgetcsvというすげー便利な関数があるが、
たとえば単純にカンマ区切りのデータの場合はファイルを読み込んで
,でexplodeかけても同様の動きをする。
ってことで今回で3回目になるPHP Tipsですが、
ファイルの中身を読むにもfopen関数やfile関数やfile_get_contents関数やら色々ある、
結局どれを使えばいいんだよって話になるので
とりあえずベンチってみた。
data1-1,data1-2,data1-3,...
data2-1,data2-2,data3-3,...
...
ってのがCSVデータなんだけど
それを以下の4通りで取得してみる。
1. fgetcsv
2. file→explode(,)
3. fopen→fread→explode(\n)→explode(,)
4. file_get_contents→explode(\n)→explode(,)
結論から言うとfgetcsv意外はどれも早い。
今回行ったベンチマークでは3<2<4<<1の順番だった。
fgetcsvは他のに比べて約2倍処理に時間がかかる。
2,3,4は多分誤差の範囲だと思います。
コードの読みやすさから個人的には2.がお勧めです。
Perlな人はfopenのほうが使いやすいのかな?
まー人それぞれだと思います。
ではなんでfgetcsvが遅いかと言うと、fgetcsvは
フィールド囲いこみ文字もちゃんと認識してくれるからです。
フィールド囲いこみ文字ってのは
data1,data2,"data3,5,6",data7,"data8
改行があってからdata9",data10,...
ってな感じの「"」です。
よーはカンマ区切りのデータだと区切り文字になってるカンマはデータに入れられないし、行も改行でわけられてるから改行でデータに入れることもできないけどよーはCSVだとできます。
まーよく意味がわからない人はExcelで名前をつけて保存でCSVを選択してから保存してテキストエディタを開いてみてください。
これを2,3,4で読めるようにするには結構苦労が要るからfgetcsvを使うと一発ですって話です。
よーは時と場合によって使う関数を変えましょうって話です。
いや、CSVなんて使わずにDB使えば、、、って話はとりあえずなしです。
※ PHPやPerlなどで膨大なテキストを操作する場合は、気をつけましょう。
サーバによってはCGIの実行速度が制限されていて保存が完了する前に実行が止められるとデータが飛びます!
PHPでCSVを操作するにはfgetcsvというすげー便利な関数があるが、
たとえば単純にカンマ区切りのデータの場合はファイルを読み込んで
,でexplodeかけても同様の動きをする。
ってことで今回で3回目になるPHP Tipsですが、
ファイルの中身を読むにもfopen関数やfile関数やfile_get_contents関数やら色々ある、
結局どれを使えばいいんだよって話になるので
とりあえずベンチってみた。
data1-1,data1-2,data1-3,...
data2-1,data2-2,data3-3,...
...
ってのがCSVデータなんだけど
それを以下の4通りで取得してみる。
1. fgetcsv
2. file→explode(,)
3. fopen→fread→explode(\n)→explode(,)
4. file_get_contents→explode(\n)→explode(,)
結論から言うとfgetcsv意外はどれも早い。
今回行ったベンチマークでは3<2<4<<1の順番だった。
fgetcsvは他のに比べて約2倍処理に時間がかかる。
2,3,4は多分誤差の範囲だと思います。
コードの読みやすさから個人的には2.がお勧めです。
Perlな人はfopenのほうが使いやすいのかな?
まー人それぞれだと思います。
ではなんでfgetcsvが遅いかと言うと、fgetcsvは
フィールド囲いこみ文字もちゃんと認識してくれるからです。
フィールド囲いこみ文字ってのは
data1,data2,"data3,5,6",data7,"data8
改行があってからdata9",data10,...
ってな感じの「"」です。
よーはカンマ区切りのデータだと区切り文字になってるカンマはデータに入れられないし、行も改行でわけられてるから改行でデータに入れることもできないけどよーはCSVだとできます。
まーよく意味がわからない人はExcelで名前をつけて保存でCSVを選択してから保存してテキストエディタを開いてみてください。
これを2,3,4で読めるようにするには結構苦労が要るからfgetcsvを使うと一発ですって話です。
よーは時と場合によって使う関数を変えましょうって話です。
いや、CSVなんて使わずにDB使えば、、、って話はとりあえずなしです。
※ PHPやPerlなどで膨大なテキストを操作する場合は、気をつけましょう。
サーバによってはCGIの実行速度が制限されていて保存が完了する前に実行が止められるとデータが飛びます!
