如何阅读gzip压缩文件?

时间:2014-07-10 09:46:37

标签: csv go gzip

我在阅读存档的CSV文件时遇到了一些问题。

所以我想使用csv包和gzip包,但我不知道如何将它们组合起来。

gzip.Reader(p []bytes)csv.Reader()有不同的签名。

这是我的读者功能:

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

你有什么建议吗?

1 个答案:

答案 0 :(得分:19)

只需打开文件进行阅读,然后将该文件句柄与gzip一起使用,然后将该文件句柄用于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)
    }
}

这是我的(未压缩的)data.csv

"foo","bar","baz"

我的程序输出是:

foo
bar
baz

正如所料。