2014-07-10 8 views
5

Je rencontre des problèmes lors de la lecture de fichiers CSV archivés.Comment lire un fichier CSV gzippé?

Donc je veux utiliser le paquet csv et le paquet gzip pour cela, mais je ne sais pas comment les combiner. Les gzip.Reader(p []bytes) et csv.Reader() ont des signatures différentes.

Ceci est ma fonction de lecteur:

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

Avez-vous des suggestions?

+0

Première: Tampon avant décompression. Deuxièmement: Quel est le problème de brancher le 'fz' dans' csv.NewReader'? – Volker

Répondre

14

Il suffit d'ouvrir le fichier pour la lecture, puis utilisez cette poignée de fichier avec gzip et ensuite utiliser ce descripteur de fichier pour le lecteur 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) 
    } 
} 

et ceci est mon (non compressé) data.csv:

"foo","bar","baz" 

La sortie de mon programme est:

foo 
bar 
baz 

comme prévu.

+0

Merci pour votre réponse! Avec un peu de peaufinage, j'ai pu faire la même chose mais en utilisant bzip2 au lieu de gzip - le concept est assez similaire pour que je puisse le comprendre1 –