Ich stieß auf eine Gruppe von Dateien, die auf den ersten Blick problematisch zu sein schienen, aber ich konnte alle Dateien dekomprimieren, in UTF8 konvertieren und sie einfacher als erwartet zu einer Datei kombinieren. ist.
Erstellen Sie ein Backup, damit Sie die ursprüngliche Zip-Datei versehentlich löschen oder überschreiben können. Es ist möglicherweise nicht in Ordnung, wenn Sie denken, dass es in Ordnung ist. Tun Sie es also unbedingt.
Entpacken Sie zunächst die vielen ZIP-Dateien zusammen. Dies kann einfach mit dem Befehl find
erfolgen. Durch Hinzufügen von -j wird die Verzeichnisstruktur ignoriert und dekomprimiert, und die Option -B wird hinzugefügt, um ein Überschreiben zu verhindern, selbst wenn der Dateiname zu diesem Zeitpunkt dupliziert wird.
Es scheint, dass Sie den Dateinamen in SJIS konvertieren können, indem Sie "-O sjis" mit "unzip" angeben, aber ich habe viele Male festgestellt, dass es nicht funktioniert hat, daher verwende ich es hier nicht.
Entpacken Sie die ZIP-Datei
mkdir work #Arbeitsverzeichnis erstellen
cd work
find ../ -name '*.zip' -exec unzip -j -B {} \;
Sie können auch ls
und xargs
anstelle von find
verwenden.
Entpacken Sie die ZIP-Datei (mit ls und xargs).
mkdir work #Arbeitsverzeichnis erstellen
cd work
ls ../*.zip | xargs -I{} unzip -j -B {}
Als ich eine ZIP-Datei erstellt habe, war eine weitere ZIP-Datei darin. Das ist eine häufige Geschichte, aber in diesem Fall dekomprimieren Sie sie erneut wie folgt. Wenn die ZIP-Datei nach dem Dekomprimieren erneut ausgegeben wird, führen Sie sie erneut aus, bis Sie sich wohl fühlen. Je mehr Sie es ausführen, desto mehr Dateien haben Sie und desto mehr Duplikate haben Sie, aber ich plane, doppelte Datensätze später zu löschen. Daher denke ich, dass es an dieser Stelle keine Rolle spielt, wie oft Sie es ausführen, um Duplikate zu erstellen. ..
Wenn Sie nicht wie * .zip angeben, können andere Dateien als das ZIP-Format nicht dekomprimiert werden, und es tritt nur ein Fehler auf. Ich denke, dass dies in Ordnung ist. Da der Dateiname in der Vergangenheit in SJIS verstümmelt war, wird er nicht mit * .zip getroffen Weil da etwas war.
Entpacken Sie die ZIP-Datei (wenn die ZIP-Datei verschachtelt ist)
find ./ -type f -exec unzip -j -B {} \;
Es gibt andere Möglichkeiten, ls
und xargs
zu verwenden, aber ich denke, es ist besser, eine Methode zu wählen, die für Sie leicht zu verstehen ist, als sie kurz zu schreiben.
Entpacken Sie die ZIP-Datei (mit ls und xargs).
ls * | xargs -I{} unzip -j -B {}
Wenn Sie es vollständig entpacken, ist es problematisch, wenn die ZIP-Datei erhalten bleibt. Löschen Sie sie daher. Wenn Sie nach der Erweiterung urteilen können, können Sie "rm" verwenden, aber dieses Mal werde ich versuchen, die Datei zu finden und zu löschen, deren Inhalt im ZIP-Format vorliegt, vorausgesetzt, dass dies nicht der Fall ist.
Dies ist nicht allzu schwierig und es ist überraschend einfach, mit "file" und "grep" zu arbeiten. Überprüfen Sie die Zieldatei für alle Fälle, bevor Sie sie löschen. Wenn es viele Dateien gibt, wird es viel Zeit in Anspruch nehmen. Wenn Sie also nach dem Dateinamen urteilen können, ist es meiner Meinung nach besser, sie mit rm * .zip
zu löschen.
Bestätigung der ZIP-Zieldatei
file * | grep 'Zip archive'
Führen Sie das Löschen der ZIP-Datei durch
file * | grep 'Zip archive' | sed 's/: *Zip archive.*//' | xargs -I{} rm {}
Wenn der dekomprimierte Dateiname SJIS lautet, wird er verstümmelt. Ändern Sie daher alle Dateinamen in UTF8. Mit dem Befehl "convmv" ist das ganz einfach. Wenn Sie nicht über "convmv" verfügen, installieren Sie es mit "sudo apt install convmv".
Übrigens werden in diesem Fall die Dateien später zu einer zusammengefasst, sodass der Dateiname tatsächlich alles sein kann. Selbst wenn Sie es nicht gut konvertieren können, müssen Sie sich nicht daran halten, und selbst wenn die Charaktere verstümmelt sind, ist es fast in Ordnung.
Konvertieren Sie den Dateinamen in UTF8
convmv -f sjis -t utf8 --notest *
Ich benutze das bekannte nkf
. Wenn es nicht installiert ist, installieren Sie es mit sudo apt install nkf
. nkf
ist praktisch, da Sie den Zeichencode konvertieren und gleichzeitig den Zeilenvorschubcode ändern können. Wenn es viele Dateien gibt, wird es "Zu viele offene Dateien" sein, also verwende ich "find", aber wenn es nur wenige Dateien gibt, kann es meiner Meinung nach als "nkf ~ *" geschrieben werden.
Konvertieren Sie den Dateiinhalt in UTF8 (Teil 1).,Verwenden Sie find)
find ./ -type f -exec nkf -Lu -w --overwrite {} \;
Konvertieren Sie den Dateiinhalt in UTF8 (Teil 2).,Wenn es nur wenige Dateien gibt)
nkf -Lu -w --overwrite *
Konvertieren Sie den Dateiinhalt in UTF8 (Teil 3).,Mit ls und xargs)
ls * | xargs -I{} nkf -Lu -w --overwrite {}
Es ist möglicherweise nicht so schwierig, wenn Sie wissen, dass "der Elementname in der ersten Zeile aller CSV-Dateien enthalten ist, sodass Sie sie nicht einfach mit" cat "anhängen können". Es ist so, als würden die Daten (Header) in die erste Zeile und die Daten mit dem Header in der ersten Zeile aus jeder Datei entfernt.
Gzip-Komprimierung durch Zusammenkleben aller Dateien und Entfernen von Duplikaten
(cat * | head -1; ls * | xargs -I{} sed '1d' {} | sort | uniq) | gzip > all.csv.gz
Wenn Sie den "M-Befehl" von "NYSOL" verwenden können, können Sie übrigens wie folgt schreiben. Der M-Befehl von NYSOL kann nicht nur CSV-Dateien verarbeiten, sondern auch große Dateien mit wenig Speicher, sodass die Verwendung sehr praktisch ist.
Gzip-Komprimierung durch Zusammenfügen aller Dateien mit dem Befehl M, um Duplikate zu entfernen
mcat i=* | muniq k='*' | mfldname -q | gzip > all.csv.gz
Es ist gzip-komprimiert, aber wenn Sie die Größe nach der Dekomprimierung überprüfen möchten, sieht es wie folgt aus.
Überprüfen Sie die Größe nach dem Entfalten
zcat all.csv.gz | wc -l -c
Größenbestätigung nach Erweiterung (Ausführungsergebnis)
$ zcat all.csv.gz | wc -l -c
748654 229449752
Wenn Sie die gzip-komprimierte Datei entpacken, sehen Sie, dass die Anzahl der Datensätze ungefähr 740.000 und die Dateigröße ungefähr 200 MB beträgt.
Liegt es daran, dass kleinere Dateien einfacher zu handhaben sind? Es hängt vom Inhalt der Datei ab, aber ich denke, die Größe wird ungefähr 1/8 betragen, und wenn es R data.table :: fread ist, kann es wie data.table :: fread ("zcat all.csv.gz") geschrieben werden. Ist es nicht schwierig zu benutzen, selbst wenn es gzip-komprimiert ist?