Ich habe eine CSV-Datei (ca. 10.000 Zeilen; jede Zeile hat 300 Spalten) auf dem LINUX-Server gespeichert. Ich möchte diese CSV-Datei in 500 CSV-Dateien mit jeweils 20 Datensätzen aufteilen. (Jeder hat den gleichen CSV-Header wie in der ursprünglichen CSV)
Gibt es einen Linux-Befehl, der diese Konvertierung unterstützt?
Antworten:
Hat es zu einer Funktion gemacht. Sie können jetzt anrufen
splitCsv <Filename> [chunkSize]
Gefunden unter: http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html
quelle
split
, die Splits in neue Dateien mit jeweils 20 Zeilen lang, mit dem Präfixsplit_
2: eine Iteration durch die neuen split_ * Dateien, jeden Namen auf die Variable speichertfile
, einen nach dem anderen 3: für jede ... 4: Schreiben Sie die erste Zeile (Spaltenüberschriften) aus unserer Originaldatei in einetmp_file
5: Fügen Sie die 20-Zeilen-Split-Datei antmp_file
6 an: Überschreiben Sie die alte split_ * -Datei mit der neuentmp_file
, damit die Spaltenüberschriften erhalten bleibenecho -e "$HEADER\n$(cat $i)" > $i
ist unnötig unverformbar. Ich habe es durch ersetztsed -i -e "1i$HEADER" "$i"
.Verwenden Sie den Linux-Split-Befehl:
Teilen Sie die Datei "file.txt" in Dateien auf, die mit dem Namen "new" beginnen und jeweils 20 Textzeilen enthalten.
Geben Sie
man split
an der Unix-Eingabeaufforderung weitere Informationen ein. Sie müssen jedoch zuerst den Header aus file.txt entfernen (tail
z. B. mit dem Befehl) und ihn dann wieder zu jeder der geteilten Dateien hinzufügen.quelle
wc -l
Sie diese Option, um die Anzahl der Zeilen abzurufen. Nehmen Sie dann diesen Wert, subtrahieren Sie 1 (nehmen Sie an, dass dieswc -l
50 ergibt ) und führen Sie danntail -n 49
(in diesem Beispiel) aus, um alles außer der Kopfzeile abzurufen. Beachten Sie, dasswc -l
<newline> -Zeichen gezählt werden. Wenn die letzte Zeile nicht mit einem Newline-Zeichen endet, ist die Anzahl der Zeilen um 1 verringert.tail -n +2
druckt alle Zeilen außer der ersten.--additional-suffix=.csv
Das sollte funktionieren !!!
file_name
= Name der Datei, die Sie teilen möchten.10000
= Anzahl der Zeilen, die jede geteilte Datei enthalten würdefile_part_
= Präfix des geteilten Dateinamens (file_part_0, file_part_1, file_part_2..etc geht weiter)quelle
head -200000 file.csv | split -l 10000 - new_
Dies sollte es für Sie tun - alle Ihre Dateien werden am Ende Part1-Part500 genannt.
quelle
Ich habe eine einzeilige Antwort (dies gibt Ihnen 999 Datenzeilen und eine Kopfzeile pro Datei).
https://stackoverflow.com/a/53062251/401226
quelle