1

を削除しUpload、列の 0 を 888 に変更したいのですqtyが、以下は私のコードですcsv。ファイルの内容が乱れます。私のコードを修正する方法。ありがとうございました

 $dir   = getcwd();
   $files = scandir($dir);
   foreach ($files as $file)
   {
       $parts = pathinfo($file);
       if($parts['extension']!="csv") continue;
       if (($handle = fopen($file, "r")) !== FALSE)
       {
           $new_content =  implode(',', fgetcsv($handle, 1000, ","))."\n";
           while (($data = fgetcsv($handle, 1000, ",")) !== FALSE)
           {
               $data[12]=substr($data[12],9);
               $data[13]=substr($data[13],9);
               $data[14]=substr($data[14],9);
               $data[42]=888;
               $new_content .= implode(',', $data)."\n";
           }
           fclose($handle);
        file_put_contents($file, $new_content);
       }
   }

テスト csv ファイル http://phplist.xxmn.com/women.csv

4

1 に答える 1

1

これは、.csv ファイルの最初の行が 1000 文字を超えているためです。各行の大きさが事前にわからない場合は、次のことをお勧めします。

$data = fgetcsv($handle, 0, ','); // >= PHP 5.0.4

または

$data = fgetcsv($handle, 4096, ',');

最初のオプションでは処理が遅くなる可能性がありますが、おそらく無視できる程度です。

fputcsvを使用して出力を書き込むことも検討する必要があります。

$dir   = getcwd();
$files = scandir($dir);
foreach ($files as $file) {
   $parts = pathinfo($file);
   if ($parts['extension']!="csv") {
       continue;
   }
   if (false === ($outfile = fopen("$file.tmp", "w"))) {
       continue;
   }
   if (($handle = fopen($file, "r")) !== FALSE) {
       fputcsv($outfile, fgetcsv($handle, 4096, ","));

       while (($data = fgetcsv($handle, 4096, ",")) !== FALSE) {
           $data[12]=substr($data[12],9);
           $data[13]=substr($data[13],9);
           $data[14]=substr($data[14],9);
           $data[42]=888;
           fputcsv($outfile, $data);
       }
       fclose($handle);
       fclose($outfile);
       if (false === rename("$file.tmp", $file)) {
           die("Could not rename temporary file");
       }
   }
}
于 2012-05-08T06:04:19.990 に答える