csvを開いて編集し、同じディレクトリに別名保存するphpを作ろうしましたがよく分からなくなりギブ。
やりたいことは以下です
moto.csvを
aaa,0.3,コメント01
bbb,0.4,コメント02
ccc,0.5,コメント03
2行目数字の部分を2倍し、コメントを削除してato.csvに格納です。
ato.csv
aaa,0.6
bbb,0.8
ccc,1
$Data=file('moto.csv');
for($i=0;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);
$name = $line[0];
$number = $line[1];
$sum = 2 * $number;
みたいな感じなのか、色々ネットサーフィンしたんですがよく分かりませんでした。
助けてくださいませ。
$ato = ''; $Data=file('moto.csv'); foreach ($Data as $data) { $line=explode(",",$data); if (count($line) == 3) { $name = $line[0]; $number = $line[1]; $sum = 2 * $number; $ato .= $name.",".$sum."\n"; } } file_put_contents("ato.csv", $ato);
多少コードを変更して各行ごとの処理をしたものを$atoの文字列に結合していって最後にfile_put_contentsで出力するようにしました。
配列をforで回す場合はforeachを使った方がベターだと思います。
if (count($line) == 3)
はcsvファイルに空文があった場合への対処です。場合によっては違う条件にする必要があるでしょう。
各行ごとにその都度出力するのであればループの中で
file_put_contents("ato.csv",$name.",,".$sum."\n",FILE_APPEND);
とすれば可能ですが追記なので最初に削除の処理を入れる必要があるように思います。
$in = fopen("moto.csv", "r"); $out = fopen("ato.csv", "w"); while (($line = fgetcsv($in, 1000, ",")) !== FALSE) { if (count($line) == 3) { $line[1] *= 2; array_pop($line); fputcsv($out, $line); } } fclose($in); fclose($out);
csvを扱う場合はfgetcsv,fputcsvを使ったほうが可読性がいいように思います。
array_popは配列から最後の要素を取り去ります。この場合はコメントを削除することになります。
仮に配列の途中にあるものを削除する場合はarray_spliceが使えます。
そんな感じであってます。
あとはカンマでつなげてファイルに書いていくだけです。
ファイルへの書き込みは file-put-contents で良いんじゃないですか。
http://jp.php.net/manual/ja/function.file-put-contents.php
これで一行毎に書いていくと効率悪いですが、とりあえず練習はそれでいいと思います。
あとは結果を変数に詰め込むとか、配列を直接書き換えるとかして、最後に一気に書くとか、さらに読み書きを一行ずつやっていくとか色々やり方があるので、じっくりやれば修行できますよ。
頑張ってください。