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