Skip to content

Instantly share code, notes, and snippets.

@scriptonist
Created May 6, 2019 08:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scriptonist/02f3cf5c2aa9ed5933de929ebb8ec75f to your computer and use it in GitHub Desktop.
Save scriptonist/02f3cf5c2aa9ed5933de929ebb8ec75f to your computer and use it in GitHub Desktop.
CSV Reader
package main
import (
"encoding/csv"
"flag"
"fmt"
"io"
ccsv "github.com/tsak/concurrent-csv-writer"
// "math/rand"
"os"
"strconv"
"strings"
"sync"
"time"
)
var filename = flag.String("f", "REQUIRED", "source CSV file")
var numChannels = flag.Int("c", 4, "num of parallel channels")
var outFile, err = ccsv.NewCsvWriter("output.csv")
//var bufferedChannels = flag.Bool("b", false, "enable buffered channels")
var wg sync.WaitGroup
func main() {
start := time.Now()
flag.Parse()
fmt.Print(strings.Join(flag.Args(), "\n"))
if *filename == "REQUIRED" {
return
}
defer outFile.Close()
csvfile, err := os.Open(*filename)
if err != nil {
fmt.Println(err)
return
}
defer csvfile.Close()
reader := csv.NewReader(csvfile)
i := 0
for {
record, err := reader.Read()
if err == io.EOF {
break
} else if err != nil {
fmt.Println(err)
return
}
i++
wg.Add(1)
go processData(i, record)
}
wg.Wait()
fmt.Printf("\n%2fs", time.Since(start).Seconds())
}
func processData(i int, r []string) {
fmt.Println(r[0])
i, err := strconv.Atoi(r[0])
if err != nil {
// handle error
fmt.Println(err)
// os.Exit(2)
}
j := i + 1
t := strconv.Itoa(j)
r[0] = t
outFile.Write(r)
defer wg.Done()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment