omq/export_csvzip.go

75 lines
1.1 KiB
Go

package main
import (
"archive/zip"
"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
}
z := zip.NewWriter(f)
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
}
err = f.Close()
if err != nil {
return err
}
return nil
}