2014-07-10 16 views
5

Ich habe Probleme beim Lesen von archivierten CSV-Dateien.Wie lese ich eine gezippte CSV-Datei?

Also ich möchte das csv Paket und das gzip Paket dafür verwenden, aber ich weiß nicht, wie man sie kombiniert.

Die gzip.Reader(p []bytes) und die csv.Reader() haben unterschiedliche Signaturen.

Dies ist meine Leser Funktion:

func reader(filename string, c chan string) { 
    fi, err := os.Open(filename) 
    var r *bufio.Reader 
    if err != nil { 
     fmt.Println("%q",err) 
     os.Exit(1) 
    } 

    fz, err := g.NewReader(fi) 

    if err != nil { 
     r = bufio.NewReader(fi) 
    }else { 
     r = bufio.NewReader(fz) 
    } 


    for { 
     line, err := r.ReadString('\n') 
     if err != nil { 
      fmt.Println("done reading file") 
      c <- "done" 
      break 
     }else{ 
      c <- fmt.Sprintf("%q",strings.Fields(line)) 
     } 
    } 
} 

Haben Sie Vorschläge?

+0

Zuerst: Puffer vor dem Entpacken. Zweitens: Was ist falsch daran, die 'fz' in' csv.NewReader' zu stecken? – Volker

Antwort

14

Nur Öffnen Sie die Datei zum Lesen verwenden, dann die Datei-Handle mit gzip und dann diese Datei-Handle für den CSV-Reader verwenden:

package main 

import (
    "compress/gzip" 
    "encoding/csv" 
    "fmt" 
    "log" 
    "os" 
) 

func main() { 
    f, err := os.Open("data.csv.gz") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer f.Close() 
    gr, err := gzip.NewReader(f) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer gr.Close() 

    cr := csv.NewReader(gr) 
    rec, err := cr.Read() 
    if err != nil { 
     log.Fatal(err) 
    } 
    for _, v := range rec { 
     fmt.Println(v) 
    } 
} 

und das ist mein (unkomprimiert) data.csv:

"foo","bar","baz" 

der Ausgang meines Programms ist:

foo 
bar 
baz 

wie erwartet.

+0

Danke für Ihre Antwort! Mit ein wenig Feinabstimmung konnte ich dasselbe machen, aber mit bzip2 anstelle von gzip - das Konzept ist ähnlich genug für mich, um es herauszufinden –