如何进行 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)
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)