2013-05-24 5 views
5

Ich habe Excel (Datei.xls)/CSV (file.csv) Datei, die enthält/werden Hunderttausende von Einträgen, sogar Millionen, die ich denke. Ist es möglich diese Datei in mehrere Dateien zu teilen? Wie file.xls zu file1.xls, file2.xls, file3.xls und so weiter.Split große Excel/Csv-Datei auf mehrere Dateien auf PHP oder Javascript

Gibt es Bibliotheken? Ist das bei PHP möglich? oder wie wäre es mit Javascript? Auf wo kann ich angeben, wie viele Zeilen in jeder Datei enthalten sein sollen?

Dank

+1

Sprechen Sie über eine xls (BIFF) Datei? oder über eine CSV-Datei? oder eine CSV-Datei mit einer Erweiterung von .xls? Excel XLS-Dateien und CSV-Dateien zwei sind sehr unterschiedlich ... und eine xls (BIFF) -Datei ist auf 65535 Zeilen beschränkt, so dass es unmöglich ist, Millionen von Einträgen –

+0

beide, wenn Ihre Daten nicht auf mehrere Arbeitsblätter aufgeteilt ist. Möglich ist ein Cross-Compatibility-Code, der sowohl für csv als auch für Excel funktioniert. ist das überhaupt möglich? –

+0

Es ist möglich, aber Sie haben möglicherweise Speicherprobleme und eine langsame Leistung, wenn Sie über solch große Datenmengen in einem xls sprechen. Meine PHPExcel-Bibliothek kann es tun, aber ich würde empfehlen, mit geraden CSV zu bleiben, die leicht hintereinander bearbeitet werden können –

Antwort

1

Ja, es ist möglich, dass in PHP und mit CSV-Dateien zu tun. Sie iterieren im Grunde über die große Datei und chunk jede X Zeilen, diese Zeilen in eine andere Datei weiterleiten.

Sie die Informationen finden, wie in dieser Antwort hier um die große CSV-Datei als Iterator zu öffnen:

Dann brauchen Sie Chunk der Iterator jeweils Teile X Reihen. Das kann hier als Umriss erfolgen:

einfach anstelle der Ausgabe in mehr <ul>...</ul> HTML-Listen, Sie kopieren Sie in eine neue Dateien. Das funktioniert im Grunde wie skizziert in:

aber dieses Mal sind Sie wollen die SplFileObject::fputcsv method verwenden. Achten Sie darauf, dass Sie das neueste stabile PHP dafür verwenden, andernfalls müssen Sie anders vorgehen, siehe fputcsv().

Wenn die erste Zeile der ursprünglichen Datei Spaltenüberschriften enthält, könnten Sie auch Interesse an dem folgenden sein:

Es zeigt nur einige Möglichkeiten zu erweitern/Prozess der eingehende Datei Sie brauchen vielleicht nicht die vollständige Abstraktion, die Sie dort gemacht haben, nur die erste Zeile zu behalten, könnte es schon machen.

13

Schnelle und schmutzige Art und Weise eine CSV-Datei in mehrere CSV-Dateien zu spalten

$inputFile = 'input.csv'; 
$outputFile = 'output'; 

$splitSize = 10000; 

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

$rowCount = 0; 
$fileCount = 1; 
while (!feof($in)) { 
    if (($rowCount % $splitSize) == 0) { 
     if ($rowCount > 0) { 
      fclose($out); 
     } 
     $out = fopen($outputFile . $fileCount++ . '.csv', 'w'); 
    } 
    $data = fgetcsv($in); 
    if ($data) 
     fputcsv($out, $data); 
    $rowCount++; 
} 

fclose($out); 
+1

Mark - das funktioniert gut, aber angesichts der OP-Frage zum Aufteilen großer Dateien, würde das Beispiel wie geschrieben 500k Dateien mit jeweils 2 Reihen von CSV-Daten erstellen. Ich bin mir sicher, dass das nicht angenehm für ihn ist. Ich würde empfehlen, splitSize oben auf etwas Vernünftigeres zu setzen - sagen wir 10k. – Ross