2017-10-26 1 views
-3

Ich muss einen Block von n Zeilen in einer Zip-Datei schnell wie möglich lesen.Go: Zeilenblock in einer Zip-Datei lesen

Ich bin Anfänger in Go. Für bash Liebhaber, mag ich das gleiche tun wie (um einen Block von 500 Zeilen zwischen den Zeilen 199500 und 200000 zu erhalten):

time query=$(zcat fake_contacts_200k.zip | sed '199500,200000!d') 

real 0m0.106s 
user 0m0.119s 
sys 0m0.013s 

Jede Idee ist willkommen.

+7

Haben Sie etwas versucht? StackOverflow ist kein __Write-Code-für-mich-Service. –

Antwort

2
  1. Importieren archive/zip.

  2. Öffnen und lesen Sie die Archivdatei as shown in the example right there in the docs.

    • Beachten Sie, dass, um das Verhalten von zcat Sie zunächst prüfen, um die Länge des File Feld der zip.ReadCloser Instanz haben zu imitieren durch einen Aufruf zip.OpenReader zurückgegeben, und fehlschlagen, wenn es nicht gleich ist 1 - das heißt, es gibt keine Dateien im Archiv oder es sind zwei oder mehr Dateien drin¹.

    • Beachten Sie, dass Sie den Fehlerwert überprüfen durch einen Aufruf zip.OpenReader zurück für zip.ErrFormat gleich sein, und wenn es gleich, müssen Sie:

      • die zurück zip.ReadCloser schließen.
      • Versuchen Sie, die Datei als gzip-formatiert neu zu interpretieren (Schritt 4).
  3. Nehmen Sie die erste (und einzige) File Mitglied und Anruf Open darauf.

    Sie können dann den Inhalt der Datei von der zurückgegebenen io.ReaderCloser lesen.

    Nach dem Lesen müssen Sie Close() für diese Instanz anrufen und dann schließen Sie auch die Zip-Datei. Das ist alles. ∎

  4. Wenn Schritt (2) fehlgeschlagen ist, weil die Datei nicht über das Zip-Format verfügt, testen Sie, ob es sich um ein Gzip-Format handelt.

    Um dies zu tun, tun Sie grundsätzlich die gleichen Schritte mit dem compress/gzip Paket.

    Beachten Sie, dass gzip im Gegensatz zum zip-Format keine Dateiarchivierung bietet - es ist lediglich ein Komprimierer, daher gibt es keine Metainformationen zu Dateien im gzip-Stream, nur die komprimierten Daten. (Diese Tatsache durch den Unterschied in den Namen der Pakete unterstrichen.)

    Wenn ein Versuch, die gleiche Datei als gzip-Archiv zu öffnen die gzip.ErrHeader Fehler zurückgibt, bürgen Sie heraus, sonst die Daten lesen nach womit Sie den Leser schließen. Das ist alles.∎

Um nur die spezifischen Zeilen aus der entpackten Datei zu verarbeiten, Sie

  1. die Zeilen vor dem ersten zu verarbeiten überspringen bräuchten.
  2. Verarbeiten Sie die Zeilen bis einschließlich der letzten zu verarbeitenden Zeile.
  3. Verarbeitung stoppen.

die Daten aus einem io.Reader oder io.ReadCloser, lesen zu interpretieren es am besten bufio.Scanner verwenden - die sehen, dass es „Beispiel (Linien)“.

P.S.

Bitte lesen Sie gründlich this essay um zu versuchen, Ihre nächste Frage besser als diese zu machen.


¹ Sie können alle Dateien auch lesen und deren Inhalt als zusammenhängende Strom interpretieren - das sich aus dem Verhalten von zcat aber das könnte besser sein, abweichen würde. Es hängt wirklich von Ihren Daten ab.

Verwandte Themen