82 lines
1.1 KiB
Go
82 lines
1.1 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"encoding/csv"
|
||
|
"os"
|
||
|
|
||
|
"github.com/klauspost/compress/zstd"
|
||
|
)
|
||
|
|
||
|
// Экспорт в CSV, сжатый в ZIP-архив
|
||
|
type CsvZstExporter struct {
|
||
|
Encoding Encoding
|
||
|
}
|
||
|
|
||
|
func (c *CsvZstExporter) FileExt() string {
|
||
|
return ".csv.zst"
|
||
|
}
|
||
|
|
||
|
func (c *CsvZstExporter) Convert(filePath string, rows chan []any) error {
|
||
|
f, err := os.Create(filePath + c.FileExt())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
buf := bufio.NewWriterSize(f, 4*1024*1024)
|
||
|
|
||
|
z, err := zstd.NewWriter(buf)
|
||
|
if err != nil {
|
||
|
f.Close()
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
enc, err := c.Encoding.Encoder()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
w := csv.NewWriter(enc.Writer(z))
|
||
|
w.Comma = ';'
|
||
|
|
||
|
rowNum := 0
|
||
|
for row := range rows {
|
||
|
rowNum++
|
||
|
rowsStr := make([]string, len(row))
|
||
|
for i := range row {
|
||
|
rowsStr[i] = toCsvField(row[i])
|
||
|
}
|
||
|
|
||
|
err = w.Write(rowsStr)
|
||
|
if err != nil {
|
||
|
f.Close()
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
w.Flush()
|
||
|
if err = w.Error(); err != nil {
|
||
|
f.Close()
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = z.Close()
|
||
|
if err != nil {
|
||
|
f.Close()
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = buf.Flush()
|
||
|
if err != nil {
|
||
|
f.Close()
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
err = f.Close()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|