Große CSV-Dateien am Mac aufteilen

Wie man mithilfe des Terminal unter macOS große, größere und allergrößte CSV-Dateien mit ein paar wenigen Befehlen in Teilstücke aufteilt.

Schritt 1: Datei nach Anzahl der Zeilen splitten

Splitten wir also unsere Quelldatei mit 5.000, 10.000 oder 250.000 Zeilen so auf, dass daraus mehrere Dateien werden, die jeweils zB 1.000 Zeilen enthalten. Terminal starten, in den Ordner der Datei wechseln, dann folgenden Befehl eingeben. (Die Zahl „1000“ stellt die Gesamtzahl der Zeilen – inklusive Kopfzeile! – dar und ist natürlich beliebig anpassbar.)

split -l 1000 -d quelldatei.csv zieldatei-

Um ganz sicher zu gehen, die richtigen Daten eingegeben zu haben, ziehe ich zB den Dateinamen immer per Drag and Drop ins Terminalfenster an die Stelle, wo im Beispiel oben „quelldatei.csv“ steht.

Sollen die Zieldateien nicht im aktuellen Ordner abgelegt werden, muss der Dateiname der Zieldatei auch den gesamten Pfad beinhalten!

Ich empfehle, den Namen der Zieldatei mit einem Bindestrich zu beenden, denn dort werden Zahlen angehängt. In konkreten Fall wird aus der einen „quelldatei.csv“ ein Set von 5 Dateien: zieldatei-1, zieldatei-2, zieldatei-3, usw. (Ja, richtig gesehen: Die Dateien haben keine Dateiendung!)

Schritt 2: Endung „.csv“ anhängen

Machen wir es uns leicht und hängen wir in einem Aufwasch allen neu generierten Dateien die Endung „.csv“ an. (Sollten die Zieldateien in einem anderen Ordner abgelegt worden sein, würde ich zuerst im Terminal dorthin wechseln.)

for i in $(find zieldatei-*);
 do mv $i "$i.csv";
done

Dieses Codeschnippsel läuft durch alle Dateien, die mit dem String „zieldatei-“ beginnen durch und hängt die Endung „.csv“ an.

Das war’s. Wir haben nun aus einer großen CSV-Datei mehrere kleine gemacht, die ganz normal weiterverarbeitet werden können.

Schritt 3: Kopfzeile der ersten Datei überall

Häufig ist es vorteilhaft, die Kopfzeile (und damit die Spaltenüberschriften) mit im CSV-File zu haben. Damit das nicht nur im ersten der Fall ist (denn die Spaltenüberschriften sind ja auch nichts anderes als eine Zeile), kopieren wir die erste Zeile des ersten Files in alle folgenden Dateien:

for i in $(find . -type f -name "zieldatei-*.csv" -not -name "zieldatei-00.csv");
 do echo -e "$(head -1 zieldatei-00.csv)\n$(cat $i)" > $i;
done

Fertig. Nun haben wir aus einer potentiell riesigen CSV-Datei mit hunderten oder tausenden Zeilen mehrere kleine gemacht, die noch dazu alle auch eine Kopfzeile haben!

Diese hervorragend einfache Anleitung habe ich bei Datablist gefunden und adaptiert als ich eine Datei mit 1,6 Millionen Zeilen in von Excel gut verarbeitbare Teilstücke mit je 25.000 Zeilen aufteilen musste. Gesamtaufwand: 3 Minuten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert