Files
script/output_csv.go

71 lines
1.2 KiB
Go
Raw Permalink Normal View History

2025-08-30 22:00:31 +03:00
package script
import (
"encoding/csv"
"errors"
"os"
)
// CSV creates csv.Writer writing to underlying file.
// Do not forget to call Close method once you are done.
func NewCSVWriter(filename string) (*CSVWriter, error) {
return newCSVwriter(filename)
}
type CSVWriter struct {
f *os.File
wr *csv.Writer
err error
}
// Write writer row to csv. Writes are buffered
func (c *CSVWriter) Write(record []string) error {
2025-08-30 22:00:31 +03:00
err := c.wr.Write(record)
c.err = err
return err
}
// Close flushes underlying csv.Writer and closes
// file.
func (c *CSVWriter) Close() error {
c.wr.Flush()
flushErr := c.wr.Error()
closeErr := c.f.Close()
err := errors.Join(flushErr, closeErr)
c.err = err
if err != nil {
return err
}
return nil
}
// Error return last encountered error.
func (c *CSVWriter) Error() error {
return c.err
}
func newCSVwriter(name string) (*CSVWriter, error) {
var (
f *os.File
err error
)
if _, err = os.Stat(name); err == nil {
f, err = os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0664)
} else {
f, err = os.Create(name)
}
if err != nil {
return nil, err
}
csvwr := csv.NewWriter(f)
return &CSVWriter{f: f, wr: csvwr}, nil
}