omq/export_csvzip.go

84 lines
1.2 KiB
Go
Raw Permalink Normal View History

package main
import (
"archive/zip"
2024-03-05 21:41:27 +05:00
"bufio"
"encoding/csv"
"os"
"path/filepath"
)
// Экспорт в CSV, сжатый в ZIP-архив
type CsvZipExporter struct {
Encoding Encoding
}
func (c *CsvZipExporter) FileExt() string {
return ".zip"
}
func (c *CsvZipExporter) Convert(filePath string, rows chan []any) error {
f, err := os.Create(filePath + c.FileExt())
if err != nil {
return err
}
2024-03-05 21:41:27 +05:00
buf := bufio.NewWriterSize(f, 4*1024*1024)
z := zip.NewWriter(buf)
zw, err := z.Create(filepath.Base(filePath) + ".csv")
if err != nil {
f.Close()
return err
}
enc, err := c.Encoding.Encoder()
if err != nil {
return err
}
w := csv.NewWriter(enc.Writer(zw))
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
}
2024-03-05 21:41:27 +05:00
err = buf.Flush()
if err != nil {
f.Close()
return err
}
err = f.Close()
if err != nil {
return err
}
return nil
}