2014-07-10 14 views
5

Ho riscontrato alcuni problemi nella lettura dei file CSV archiviati.Come si legge un file CSV con gzip?

Quindi voglio utilizzare il pacchetto csv e il pacchetto gzip per questo, ma non so come combinarli.

gzip.Reader(p []bytes) e csv.Reader() hanno diverse firme.

Questa è la mia funzione di lettore:

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)) 
     } 
    } 
} 

Avete qualche suggerimento?

+0

Primo: buffer prima della decompressione. Secondo: cosa c'è di sbagliato nel collegare il 'fz' a' csv.NewReader'? – Volker

risposta

14

Basta aprire il file per la lettura, quindi utilizzare tale handle di file con gzip e quindi utilizzare tale handle di file per il lettore csv:

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) 
    } 
} 

e questo è il mio (non compresso) data.csv:

"foo","bar","baz" 

L'uscita del mio programma è:

foo 
bar 
baz 

come previsto.

+0

Grazie per la tua risposta! Con un piccolo ritocco, sono stato in grado di fare lo stesso, ma usando bzip2 invece di gzip - il concetto è abbastanza simile per me da capirlo –

Problemi correlati