2017-04-21 1 views
0

Ich versuche, große CSV-Dateien zu spalten.Right jetzt konnte ich nur csv-Dateien w/50k Spalten splitten.Wenn ich versuche, eine 100k Splitting es funktioniert nicht.Splitting große CSV-Dateien

Ich kann nicht herausfinden, was falsch ist.

Hier ist mein Code für den Splitter ich für 100k verwenden:

$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

Haben Sie Fehler-Logs? Was genau funktioniert nicht? was geschieht? –

+0

'file()' liest die gesamte Datei in den Speicher. Sie treffen wahrscheinlich ein Speicherlimit. –

+0

, wenn ich fertig bin, 100k csv-Dateien hochladen. Es hört einfach auf zu laden. –

Antwort

1

Ich vermute, dass das Problem ein Speicherlimit auf diesem Code basiert:

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

Dieser liest die gesamte Datei in den Speicher, teilt es in ein Array von Arrays auf, springt dann aus der ersten Zeile und verwirft den Rest. Da Sie nur die erste Zeile benötigen, müssen Sie nicht die gesamte Datei lesen. Stattdessen tun nur so etwas wie:

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

Dann haben Sie $fp bereits geöffnet und zeigt auf die erste Datenleitung für Ihren Spaltvorgang ,.