2014-07-10 45 views
5

Tôi đang gặp một số sự cố khi đọc tệp CSV đã lưu trữ.Làm cách nào để đọc tệp CSV được nén?

Vì vậy, tôi muốn sử dụng gói csv và gói gzip cho việc này, nhưng tôi không biết cách kết hợp chúng.

gzip.Reader(p []bytes)csv.Reader() có chữ ký khác nhau.

Đây là chức năng đọc của tôi:

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

Bạn có bất cứ lời đề nghị?

+0

Đầu tiên: Bộ đệm trước khi giải nén. Thứ hai: Có gì sai khi cắm 'fz' vào' csv.NewReader'? – Volker

Trả lời

14

Chỉ cần mở tập tin để đọc, sau đó sử dụng tập tin xử lý với gzip và sau đó sử dụng xử lý tập tin cho người đọc 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) 
    } 
} 

và đây là của tôi (không nén) data.csv:

"foo","bar","baz" 

Kết quả của chương trình của tôi là:

foo 
bar 
baz 

như mong đợi.

+0

Cảm ơn câu trả lời của bạn! Với một chút tinh chỉnh, tôi đã có thể làm điều tương tự nhưng bằng cách sử dụng bzip2 thay vì gzip - khái niệm này tương tự đủ để tôi tìm ra nó. –

Các vấn đề liên quan