2017-04-21 131 views
0

我想分裂大csv files.Right现在我只能拆分csv文件w/50k列。每当我尝试拆分100k它不起作用。分裂大csv文件

我无法弄清楚什么是错的。

这里是我的我用100K分离器代码:

$inputFile = 'uploads/uploaded.csv'; 
$outputFile = 'uploads/output'; 

$rows = array_map('str_getcsv', file($inputFile)); 
$header = array_shift($rows); 

$splitSize = 50000; 

$in = fopen($inputFile, 'r'); 

fgetcsv($in, 1000, ","); 

//array for file name 
$stored_names = array(); 

$rowCount = 0; 
$fileCount = 1; 

//split csv 
while (!feof($in)) { 
    if (($rowCount % $splitSize) == 0) { 
     if ($rowCount > 0) { 
      fclose($out); 
     } 

     $super_file_name = $outputFile . $fileCount++; 
     array_push($stored_names,$super_file_name.'.csv'); 

     $out = fopen($super_file_name. '.csv', 'w'); 

     //insert header 
     fputcsv($out,$header); 

     // array_push($stored_names,$out); 

    } 
    $data = fgetcsv($in); 
    if ($data) 
     fputcsv($out,$data); 
    $rowCount++; 
} 

fclose($out); 
+0

你有没有错误记录?什么不工作?怎么了? –

+0

'file()'将整个文件读入内存。你可能达到了内存限制。 –

+0

每当我完成上传100k csv files.It只是停止加载。 –

回答

1

我猜你的问题是在此基础上的代码内存限制:

$rows = array_map('str_getcsv', file($inputFile)); 
$header = array_shift($rows); 

这读取整个将文件分割成内存数组,然后将其分割为数组数组,然后从第一行弹出,然后丢弃其余数组。由于您只需要第一行,因此不需要读取整个文件。相反,只是这样做:

$fp = fopen($inputFile, 'r'); 
$headers = fgetcsv($fp); 

然后,你必须$fp已经打开,指着你的分裂过程中的第一数据线,。