How do I read a gzipped CSV file?

csv, go, gzip

Solution

Just Open the file for reading, then use that file handle with gzip and then use that file handle for the csv reader:

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

and this is my (uncompressed) `data.csv`:

"foo","bar","baz"

The output of my program is:

foo
bar
baz

as expected.

Problem

I'm facing some issues in reading archived CSV files. So I want to use the `csv` package and the `gzip` package for this, but I don't know how to combine them. The `gzip.Reader(p []bytes)` and the `csv.Reader()` have different signatures. This is my reader function: ``` 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)) } } } ``` Do you have any suggestions ?

Original source