在 golang 中编码为 CSV 然后 ZIP

cod*_*nky 6 stream go

如何进行 CSV 编码然后压缩?

有没有办法将一个作家与另一个作​​家联系起来?我必须在写入器之间创建一个新的缓冲区吗?

var buf bytes.Buffer

zipWriter := zip.NewWriter(&buf)
csvwriter := csv.NewWriter(zipWriter) // <--- zip writer doesn't implement `io.writer`

csvwriter.Write([]string{"a", "b\"fwr", "c"})
csvwriter.Write([]string{"a", "e", "ww"})
csvwriter.Flush()

println(buf.String())
Run Code Online (Sandbox Code Playgroud)

Stu*_*nie 8

zip生成具有目录结构的结构化 zip 文件,这意味着您需要独立创建和添加每个文件。

示例Playground演示了如何添加 CSV 文件。它还演示了如何打开压缩的 zip 文件并枚举文件。


如果您想将gzip文件作为单个压缩流,例如:

$ gzip somefile.csv
Run Code Online (Sandbox Code Playgroud)

生产somefile.csv.gz

然后你可以按照这个操场演示执行以下操作

package main

import (
    "bytes"
    "compress/gzip"
    "encoding/csv"
    "fmt"
    "io/ioutil"
)

func main() {
    var buf bytes.Buffer

    zipWriter := gzip.NewWriter(&buf)
    csvwriter := csv.NewWriter(zipWriter)

    csvwriter.Write([]string{"a", "b\"fwr", "c"})
    csvwriter.Write([]string{"a", "e", "ww"})
    csvwriter.Flush()
    zipWriter.Flush()
    zipWriter.Close()

    fmt.Println(buf.Bytes())
    zipReader, _ := gzip.NewReader(bytes.NewReader(buf.Bytes()))
    d, err := ioutil.ReadAll(zipReader)
    if err != nil {
        fmt.Println("err", err)
    }
    fmt.Println(string(d))
}
Run Code Online (Sandbox Code Playgroud)