• ベストアンサー

CSVデータを読み込み、ファイルにカテゴリを分けて書きこむ

CSVファイル例 01,0101,○○○,○○○□□,010101, 01,0102,○○○,○○○■□,010102, 02,0201,○○○,○○○□□,020101, ・・・・・ というファイルがあったとすると、 1番目の「01」「02」と、分けて別のファイルに保存がしたいです。 書き込み自体は出来るようなのですが、なぜかループが、番号ごとに1回しかされずに、 log/01.cgi 01<>0101<>○○○<>○○○□□<>010101 log/01.cgi 02<>0201<>○○○<>○○○□□<>020101 となってしまい、全ての生成したファイルには1行しか格納されていません。 ちなみに、csvファイルは1万行近くあります。 ソースはこのような感じです。 $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; $cate = $line[0].",,".$line[1]; # サブカテゴリ用 $LOG[$cate] .= $push_line; # カテゴリ用ログを保存 } なお、csvファイルは、 01・・・ 02・・・ 01・・・ 03・・・ のようになっているため、全ての行を読み込むことはしていると思います。 しかし、ログファイルにはなぜか1行分しか書き込まれていません。書き込みの文は以下になります。 foreach($LOG as $key => $value){ $explode = explode(",,",$key); if($explode[0]){ $logfile = "./log/".urlencode($explode[0]).".cgi"; } $file = fopen("$logfile", 'w'); flock($file,LOCK_EX); fwrite($file, $value); flock($file,LOCK_UN); fclose($file); 解決法が分かる方、回答のほどよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

ソースが完全ではないためよく分からない個所が何箇所かありますが。 >$cate = $line[0].",,".$line[1]; # サブカテゴリ用 >$LOG[$cate] .= $push_line; # カテゴリ用ログを保存 があるということは、 01,0101,○○○,○○○□□,010101, のデータが、 01 と 0101(01,,010101) の二つの場所に書き込まれると言うことです。 そのような動作でいいのでしょうか? とりあえず 最初の項目だけで書き込みをするやつ $log = "△△△.csv"; # ログ名 $lines = file("$log"); foreach ($lines as $l) { $line = explode(",",$l); $push_line = $line[0]."<>".$line[1]."<>".$line[2]."<>".$line[3]."<>".$line[4]."<>\n"; $LOG[$line[0]] .= $push_line; } foreach($LOG as $key => $value){ $logfile = $key.".cgi"; $file = fopen("$logfile", 'w'); fwrite($file, $value); fclose($file); }

yamasan0829
質問者

お礼

ありがとうございました! moon_nightさんの書いてくださった文通りにやってみたら成功しました! 分かりにくい説明ですいませんでした。 しかしぴたりでした。おかげで完成いたしました。 奥が深いですよねぇ。もっと勉強します!

その他の回答 (1)

  • myaa_myu
  • ベストアンサー率52% (9/17)
回答No.2

PHPには fgetcsv という、CSVファイルを認識して読み込んでくれる関数がありますので、もしよろしければ使用してみてください。 while (($data = fgetcsv($handle, 10000, ","))) {  // こうすることで、それぞれ$data[0],$data[1],$data[2]…  // というように、explodeしたときと同じ値が取得できます。  // ※引数の「10000」は適宜修正してください。 } http://jp.php.net/manual/ja/function.fgetcsv.php ご参考までに。

yamasan0829
質問者

お礼

ありがとうございました<(_ _)> fgetcsv、こんな関数があったんですね。 とても便利ですねぇ。 参考URLも見てみました。 本当に参考になりました。ありがとうございました。