2017-04-21 125 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已經打開,指着你的分裂過程中的第一數據線,。