Ruby: Wie man eine Datei in mehrere Dateien einer bestimmten Größe aufteilt

7

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

    
maasha 27.05.2011, 09:20
quelle

4 Antworten

13

[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:

%Vor%

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.

    
asaaki 27.05.2011, 14:42
quelle
11

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:

%Vor%

Die Optionen sind:

  • -C 1M Fügen Sie Zeilen mit maximal 1M in jedem Chunk
  • ein
  • -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.

    
Wayne Conrad 27.05.2011 21:47
quelle
1

Dieser Code funktioniert tatsächlich, es ist einfach und verwendet ein Array, das es schneller macht:

%Vor%     
Mario Trento 15.01.2016 19:07
quelle
0

Öffnen Sie die Datei nicht mehr, sondern öffnen Sie die Datei und weisen Sie sie der Variablen zu. Wenn Sie das Limit für die Dateigröße erreicht haben, schließen Sie die Datei und öffnen Sie eine neue Datei.

    
xinit 27.05.2011 09:45
quelle

Tags und Links