| package filesystem |
| |
| import ( |
| "bufio" |
| "encoding/csv" |
| "fmt" |
| "io" |
| "os" |
| |
| "github.com/pkg/errors" |
| ) |
| |
| type lineHandler func(csvColumns []string) |
| |
| func GenerateCSVLines(filePath string, handler lineHandler) error { |
| csvFile, err := os.Open(filePath) |
| if err != nil { |
| return errors.Wrap( |
| err, |
| fmt.Sprintf("Could not open %s", filePath), |
| ) |
| } |
| reader := csv.NewReader( |
| bufio.NewReader(csvFile), |
| ) |
| |
| isFirstLine := true |
| for { |
| line, err := reader.Read() |
| if err == io.EOF { |
| break |
| } else if err != nil { |
| return errors.Wrap( |
| err, |
| fmt.Sprintf("Could not read line from file %s", filePath), |
| ) |
| } |
| if !isFirstLine { |
| handler(line) |
| } |
| isFirstLine = false |
| } |
| return nil |
| } |
| |
| func WriteCSVToFile(headerCols []string, rowsOfCols [][]string, filepath string) error { |
| file, err := os.Create(filepath) |
| if err != nil { |
| return err |
| } |
| defer file.Close() |
| |
| writer := csv.NewWriter(file) |
| defer writer.Flush() |
| |
| if err := writer.Write(headerCols); err != nil { |
| return err |
| } |
| return writer.WriteAll(rowsOfCols) |
| } |