Ich möchte eine TXT-Datei in mehrere Dateien aufteilen, wobei jede Datei nicht mehr als 5 MB enthält. Ich weiß, dass es dafür Tools gibt, aber ich brauche das für ein Projekt und möchte es in Ruby machen. Auch mache ich das lieber mit File.open wenn möglich in Blockkontext, aber ich schade kläglich: o (
%Vor%Diese Arbeit, aber ich denke nicht, dass es elegant ist. Ich frage mich auch, ob es nur mit File.open im Blockkontext gemacht werden kann.
%Vor%Prost,
Martin
[Aktualisiert] Schrieb eine kurze Version ohne Hilfsvariablen und legte alles in eine Methode:
%Vor% Anstelle einer Zeilenschleife können Sie .read(length)
verwenden und eine Schleife nur für den EOF
-Marker und den Dateicursor ausführen.
Dies sorgt dafür, dass die Chunky-Dateien niemals größer als die gewünschte Chunk-Größe sind.
Auf der anderen Seite kümmert es sich nie um Zeilenumbrüche ( \n
)!
Zahlen für Chunk-Dateien werden aus der Ganzzahl-Division der aktuellen Datei-Cursor-Position durch Chunksize, formatiert mit "% 05d", erzeugt, was zu 5-stelligen Zahlen mit führender Null führt ( 00001
).
Dies ist nur möglich, weil .read(chunksize)
verwendet wird. Im folgenden zweiten Beispiel konnte es nicht verwendet werden!
Update: Aufteilen mit Zeilenumbrucherkennung
Wenn Sie wirklich vollständige Zeilen mit \n
benötigen, verwenden Sie dieses modifizierte Code-Snippet:
Ich musste eine Hilfsvariable line
einführen, weil ich sicherstellen möchte, dass die Chunky-Dateigröße immer unter chunksize
limit ist! Wenn Sie diese erweiterte Prüfung nicht durchführen, erhalten Sie auch Dateigrößen über dem Limit. Die Anweisung while
prüft nur im nächsten Iterationsschritt erfolgreich, wenn die Zeile bereits geschrieben wurde. (Wenn Sie mit .ungetc
oder anderen komplexen Berechnungen arbeiten, wird der Code unlesbarer und nicht kürzer als dieses Beispiel.)
Leider müssen Sie eine zweite EOF
Prüfung haben, da die letzte Chunk-Iteration meistens zu einem kleineren Chunk führt.
Es werden auch zwei Hilfsvariablen benötigt: Die line
wird oben beschrieben, die outfilenum
wird benötigt, weil die resultierenden Dateigrößen meistens nicht mit der exakten chunksize
übereinstimmen.
Bei Dateien beliebiger Größe ist split
schneller als Ruby-Ruby-Code, selbst wenn die Kosten für das Starten einer separaten ausführbaren Datei berücksichtigt werden. Es ist auch Code, den Sie nicht schreiben, debuggen oder pflegen müssen:
Die Optionen sind:
-C 1M
Fügen Sie Zeilen mit maximal 1M in jedem Chunk -d
Verwenden Sie Dezimalsuffixe in den Ausgabedateinamen test.txt
Der Name der Eingabedatei ''
Verwenden Sie ein leeres Ausgabedatei-Präfix Sofern Sie nicht Windows verwenden, ist dies der richtige Weg.
Dieser Code funktioniert tatsächlich, es ist einfach und verwendet ein Array, das es schneller macht:
%Vor%