Skip to content

Instantly share code, notes, and snippets.

@rabingaire
Created August 23, 2019 06:59
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 rabingaire/30f6a64b887b015d47c463c6d425e11f to your computer and use it in GitHub Desktop.
Save rabingaire/30f6a64b887b015d47c463c6d425e11f to your computer and use it in GitHub Desktop.
CSV Extractor: Reads CSV file and creates a sub CSV file given start row and end row
package main
import (
"encoding/csv"
"log"
"os"
"strconv"
)
func main() {
args := os.Args[1:]
if len(args) < 3 {
log.Fatal("Pass all the arguments")
}
inputFileName := args[0]
start, err := strconv.Atoi(args[1])
if err != nil {
log.Fatal(err)
}
end, err := strconv.Atoi(args[2])
if err != nil {
log.Fatal(err)
}
outputFileName := args[3]
fileReader, err := os.Open(inputFileName)
if err != nil {
log.Fatal(err)
}
csvReader := csv.NewReader(fileReader)
counter := 0
rows := make([][]string, 0)
header, err := csvReader.Read()
if err != nil {
log.Fatal(err)
}
rows = append(rows, header)
for {
row, err := csvReader.Read()
if err != nil {
log.Fatal(err)
}
if start < counter {
rows = append(rows, row)
}
if end < counter {
break
}
counter++
}
// Create a csv file
file, err := os.Create(outputFileName)
if err != nil {
log.Fatal(err)
}
defer file.Close()
csvWriter := csv.NewWriter(file)
csvWriter.WriteAll(rows)
if err := csvWriter.Error(); err != nil {
log.Fatalln("error writing csv:", err)
}
}
@rabingaire
Copy link
Author

First Argument: Input CSV file name/path
Second Argument: Start row number (0 is the first row, excluding header)
Third Argument: End row number
Fourth Argument: Output CSV file name/path

Start and End row number are both inclusive.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment