| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- package main
- import (
- "flag"
- "fmt"
- "io"
- "os"
- )
- func main() {
- op := flag.String("op", "sum", "Operation to be executed")
- column := flag.Int("col", 1, "CSV column on which to execute operation")
- flag.Parse()
- if err := run(flag.Args(), *op, *column, os.Stdout); err != nil {
- _, err := fmt.Fprintln(os.Stderr, err)
- if err != nil {
- return
- }
- os.Exit(1)
- }
- }
- func run(filenames []string, op string, column int, out io.Writer) error {
- var opFunc statsFunc
- if len(filenames) == 0 {
- return ErrNoFiles
- }
- if column < 1 {
- return fmt.Errorf("%w: %d", ErrInvalidColumn, column)
- }
- switch op {
- case "sum":
- opFunc = sum
- case "avg":
- opFunc = avg
- default:
- return fmt.Errorf("%w: %s", ErrInvalidOperation, op)
- }
- consolidate := make([]float64, 0)
- // Loop through all files adding their data to consolidate
- for _, fname := range filenames {
- // Open the file for reading
- f, err := os.Open(fname)
- if err != nil {
- return fmt.Errorf("cannot open file: %w", err)
- }
- // Parse the CSV into a slice of float64 numbers
- data, err := csv2float(f, column)
- if err != nil {
- return err
- }
- if err := f.Close(); err != nil {
- return err
- }
- // Append the data to consolidate
- consolidate = append(consolidate, data...)
- }
- _, err := fmt.Fprintln(out, opFunc(consolidate))
- return err
- }
|