2014-07-10 11 views
5

Arşivlenmiş CSV dosyalarını okumada bazı sorunlarla karşılaşıyorum.Gzipli bir CSV dosyasını nasıl okuyabilirim?

Bu yüzden bunun için csv paketini ve gzip paketini kullanmak istiyorum, ancak bunları nasıl birleştireceğimi bilmiyorum.

gzip.Reader(p []bytes) ve csv.Reader() farklı imzalara sahiptir.

Bu benim okuyucu fonksiyonudur:

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

Herhangi bir önerin var mı?

+0

İlk: Filigranı çıkarmadan önce. İkincisi: 'fz '' csv.NewReader '' içine takmanın nesi yanlış? – Volker

cevap

14

Hemen Açık okuma için dosya, ardından gzip ile bu dosya işleci kullanmaya ve sonra csv okuyucu için bu dosya kolu kullanın:

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

ve bu benim (sıkıştırılmamış) data.csv geçerli:

"foo","bar","baz" 
programımın

çıktı şöyledir:

foo 
bar 
baz 

beklendiği gibi.

+0

Cevabınız için teşekkürler! Biraz tweaking ile, aynı şeyi yapabildim ama gzip yerine bzip2 kullanıyorum - konsept benim için bunu anlamaya yetecek kadar benzer. –