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 }