如何读取一个gzipped的CSV文件?

huangapple go评论134阅读模式
英文:

How do I read a gzipped CSV file?

问题

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

所以我想使用csv包和gzip包来解决这个问题,但我不知道如何将它们结合起来使用。

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

这是我的读取函数:

  1. func reader(filename string, c chan string) {
  2. fi, err := os.Open(filename)
  3. var r *bufio.Reader
  4. if err != nil {
  5. fmt.Println("%q",err)
  6. os.Exit(1)
  7. }
  8. fz, err := g.NewReader(fi)
  9. if err != nil {
  10. r = bufio.NewReader(fi)
  11. } else {
  12. r = bufio.NewReader(fz)
  13. }
  14. for {
  15. line, err := r.ReadString('\n')
  16. if err != nil {
  17. fmt.Println("done reading file")
  18. c <- "done"
  19. break
  20. } else {
  21. c <- fmt.Sprintf("%q",strings.Fields(line))
  22. }
  23. }
  24. }

你有什么建议吗?

英文:

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:

  1. func reader(filename string, c chan string) {
  2. fi, err := os.Open(filename)
  3. var r *bufio.Reader
  4. if err != nil {
  5. fmt.Println(&quot;%q&quot;,err)
  6. os.Exit(1)
  7. }
  8. fz, err := g.NewReader(fi)
  9. if err != nil {
  10. r = bufio.NewReader(fi)
  11. }else {
  12. r = bufio.NewReader(fz)
  13. }
  14. for {
  15. line, err := r.ReadString(&#39;\n&#39;)
  16. if err != nil {
  17. fmt.Println(&quot;done reading file&quot;)
  18. c &lt;- &quot;done&quot;
  19. break
  20. }else{
  21. c &lt;- fmt.Sprintf(&quot;%q&quot;,strings.Fields(line))
  22. }
  23. }
  24. }

Do you have any suggestions ?

答案1

得分: 31

只需打开文件进行读取,然后使用该文件句柄进行gzip压缩,再将该文件句柄用于csv读取器:

  1. package main
  2. import (
  3. "compress/gzip"
  4. "encoding/csv"
  5. "fmt"
  6. "log"
  7. "os"
  8. )
  9. func main() {
  10. f, err := os.Open("data.csv.gz")
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. defer f.Close()
  15. gr, err := gzip.NewReader(f)
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. defer gr.Close()
  20. cr := csv.NewReader(gr)
  21. rec, err := cr.Read()
  22. if err != nil {
  23. log.Fatal(err)
  24. }
  25. for _, v := range rec {
  26. fmt.Println(v)
  27. }
  28. }

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

  1. "foo","bar","baz"

程序的输出结果是:

  1. foo
  2. bar
  3. baz

如预期所示。

英文:

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

  1. package main
  2. import (
  3. &quot;compress/gzip&quot;
  4. &quot;encoding/csv&quot;
  5. &quot;fmt&quot;
  6. &quot;log&quot;
  7. &quot;os&quot;
  8. )
  9. func main() {
  10. f, err := os.Open(&quot;data.csv.gz&quot;)
  11. if err != nil {
  12. log.Fatal(err)
  13. }
  14. defer f.Close()
  15. gr, err := gzip.NewReader(f)
  16. if err != nil {
  17. log.Fatal(err)
  18. }
  19. defer gr.Close()
  20. cr := csv.NewReader(gr)
  21. rec, err := cr.Read()
  22. if err != nil {
  23. log.Fatal(err)
  24. }
  25. for _, v := range rec {
  26. fmt.Println(v)
  27. }
  28. }

and this is my (uncompressed) data.csv:

  1. &quot;foo&quot;,&quot;bar&quot;,&quot;baz&quot;

The output of my program is:

  1. foo
  2. bar
  3. baz

as expected.

huangapple
  • 本文由 发表于 2014年7月10日 17:46:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/24673335.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定