83 lines
1.1 KiB
Go
83 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/csv"
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
// Экспорт в CSV
|
|
type CsvExporter struct {
|
|
Encoding Encoding
|
|
}
|
|
|
|
func (c *CsvExporter) FileExt() string {
|
|
return ".csv"
|
|
}
|
|
|
|
func (c *CsvExporter) 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)
|
|
|
|
enc, err := c.Encoding.Encoder()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
w := csv.NewWriter(enc.Writer(buf))
|
|
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 = buf.Flush()
|
|
if err != nil {
|
|
f.Close()
|
|
return err
|
|
}
|
|
|
|
err = f.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func toCsvField(a any) string {
|
|
if a == nil {
|
|
return ""
|
|
}
|
|
|
|
switch v := a.(type) {
|
|
case time.Time:
|
|
return v.Format("02.01.2006 15:04:05")
|
|
}
|
|
|
|
return fmt.Sprint(a)
|
|
}
|