encoding/csv

Guided tour · Encoding · pkg.go.dev →

Read and write RFC 4180 CSV. Streaming, configurable delimiter, quote-aware.

Reading

ReadAll — small files

r := csv.NewReader(strings.NewReader("name,age\nAda,36\nGrace,85\n"))
records, err := r.ReadAll()
if err != nil { log.Fatal(err) }
for _, row := range records {
    fmt.Println(row)
}
Output
[name age]
[Ada 36]
[Grace 85]

Read loop — streaming

Use when the file is large. Returns io.EOF at the end, one row at a time.

r := csv.NewReader(f)
for {
    rec, err := r.Read()
    if err == io.EOF { break }
    if err != nil { log.Fatal(err) }
    fmt.Println(rec)
}

Customize delimiter and fields

r := csv.NewReader(f)
r.Comma = ';'                  // semicolon-separated
r.Comment = '#'                // skip comment lines
r.FieldsPerRecord = -1         // allow ragged rows
r.TrimLeadingSpace = true

Writing

Writer — always Flush

w := csv.NewWriter(os.Stdout)
w.Write([]string{"name", "age"})
w.Write([]string{"Ada", "36"})
w.Flush()
if err := w.Error(); err != nil { log.Fatal(err) }