php ファイル読み込みの用途別 file,fgets,fgetcsv


ちょっとハマったので、メモしておきます。

CSVファイルの特定のフィールドの重複チェックのスクリプトを書いていた時でした。
最初は、CSVだからとfgetcsvを素直に使いました。

やり方は、シンプルに1つをファイルをファイルポイントを2つつくり、
二重のwhile文で回して、オーソドックスに比較する方法。

しかし、一度チェックした行は、最初からもう比較しなくていいわけです。
「A,B,A,C,D」の中の重複チェックは、最初のAに対して、3番目のAを見つけた後は、
二番目のBは、三番目のAからチェックすればいいわけです。
三番目のAは、四番目のCからチェックすればいいわけです。

while文で回すと、最初からになってしまいます。

while文が悪いのではなく、fgetcsvもfgetsも、行数を指定して読み込めないからなのです。

$f_array=file(指定のCSV) としておく、配列なので、指定の行数を一発で読み込めます。
すなわち、行数の始まりを変えて、whileを回せば、配列化されている場合の方が
効率的ということです。

5 x 5 x 5 x 5 x 5のチェックよりも、5 x 4 x 3 x 2 x 1の方が数が少ないというイメージです。

千行以上のCSVでしたので、かなり速度が違いました。

あと、CSVがダブルクォーテーションで囲まれている時は、fgetcsvは勝手にダブルクォーテーションを外してくれす。fileで読み込んで、たんにexplode(“,”,一行)とした時は、ダブルクォーテーションを外してくれません。そこも、ちょっと注意でした。

やっぱり、CSVを読み込んでなにかする時は、


$array=file(CSVファイル);

foreach($array as $line){
$line=str_replace(‘”‘,”,$line);
$rows=explode(“,”,$line);
}

の流れが、何でもできます。

while文で、途中から読み込むこともできますし。内側のループが、5 x 4 x 3 x 2 のように繰り返し数が少なくなっていきます。

while($c < 10){
  while($c < 10){


  }
  $c++;
}