Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将CSV文件拆分为6MB文件_Php - Fatal编程技术网

Php 将CSV文件拆分为6MB文件

Php 将CSV文件拆分为6MB文件,php,Php,我正在尝试将CSV文件划分为6mb文件。以下是我尝试过的代码 $file = 'upload/L_10001_20200916183801.csv'; $files = SplitCSVBySize($file, 10001); function SplitCSVBySize($Existingfiles, $AccountId, $splitSize = "") { $fh = fopen($Existingfiles, 'r'); $headers =

我正在尝试将CSV文件划分为6mb文件。以下是我尝试过的代码

$file = 'upload/L_10001_20200916183801.csv';

$files = SplitCSVBySize($file, 10001);

function SplitCSVBySize($Existingfiles, $AccountId, $splitSize = "") {
  
  $fh = fopen($Existingfiles, 'r');
  $headers = fgetcsv($fh);

  $files = array();

  $filepath      = 'upload/' . 'L_' . $AccountId . '_' . date('YmdHis') . '.csv';
  $files[]       = $filepath;
  $currentFile   = $filepath;

  $outputFile = fopen($filepath, 'w');
  fputcsv($outputFile, $headers);

    $rows = 0;
    while (!feof($fh)) {
      if ($row = $rowPri = fgetcsv($fh))
      {
        
        if(filesize($filepath) < 6000000){ 
          fputcsv($outputFile, $row);
        } else {

            fclose($outputFile);
            $rows = 0;

            $filepath      =  'upload/' . 'L_' . $AccountId . '_' . date('YmdHis') . '.csv';
            $files[]       = $filepath;
            $currentFile   = $filepath;
            
            $outputFile = fopen($filepath, 'w');
            fputcsv($outputFile, $headers);

            fputcsv($outputFile, $row);
        }
        $rows++;
      } 
    }
    
    fclose($outputFile);
    fclose($fh);

  return $files;
}
$file='upload/L_10001_20200916183801.csv';
$files=SplitCSVBySize($file,10001);
函数SplitCSVBySize($Existingfiles,$AccountId,$splitSize=”“){
$fh=fopen($Existingfiles,'r');
$headers=fgetcsv($fh);
$files=array();
$filepath='upload/'。'L'.$AccountId'.'.'.date('YmdHis')..csv';
$files[]=$filepath;
$currentFile=$filepath;
$outputFile=fopen($filepath,'w');
fputcsv($outputFile,$headers);
$rows=0;
而(!feof($fh)){
如果($row=$rowPri=fgetcsv($fh))
{
如果(文件大小($filepath)<6000000){
fputcsv($outputFile,$row);
}否则{
fclose($outputFile);
$rows=0;
$filepath='upload/'。'L'.$AccountId'.'.'.date('YmdHis')..csv';
$files[]=$filepath;
$currentFile=$filepath;
$outputFile=fopen($filepath,'w');
fputcsv($outputFile,$headers);
fputcsv($outputFile,$row);
}
$rows++;
} 
}
fclose($outputFile);
fclose($fh);
返回$files;
}

这里的挑战是我无法检查文件大小,因为它总是返回和第一次检查时相同的大小。请在此帮助,有什么问题或任何建议。

首先。函数(以及所有其他派生函数)被缓存。这意味着,一旦调用某个文件,其结果对于同一个文件将保持不变

您需要在调用此函数之前调用,以清除缓存

秒。您不需要调用
filesize
来获取打开文件的大小。 您可以调用打开的文件句柄并使用返回数组的
'size'
项。例如:

        ...
        $st = filestat($outputFile);
        if($st['size'] < 6000000){ 
        ...

谢谢,伙计,它像冠军一样工作。这是我一直在寻找的解决方案。
        ...
        if (ftell($outputFile) < 6000000) { 
        ...