A simple Go package that provides syntactic sugar for working with CSV files using Go 1.23's new range-over-func feature.
go get github.com/whyrusleeping/csvpackage main
import (
"fmt"
"log"
"github.com/whyrusleeping/csv"
)
func main() {
// Open CSV file with headers
it, err := csv.Open("data.csv", true)
if err != nil {
log.Fatal(err)
}
// Iterate over rows using range syntax (note: file closing is handled by Generate)
for i, row := range it.Generate {
fmt.Println(i, row)
}
// Check for errors after iteration
if err := it.Error(); err != nil {
log.Fatalf("Error reading CSV: %v", err)
}
}it, err := csv.Open("users.csv", true)
if err != nil {
log.Fatal(err)
}
defer it.Close()
// Access headers
headers := it.Headers()
fmt.Println("Columns:", headers) // e.g., [name age email]
for i, row := range it.Generate {
// row[0] = name, row[1] = age, row[2] = email
fmt.Printf("Row %d: User: %s, Age: %s\n", i, row[0], row[1])
}it, err := csv.Open("data.csv", false)
if err != nil {
log.Fatal(err)
}
defer it.Close()
for _, row := range it.Generate {
// Process raw CSV rows
fmt.Println(row)
}Creates a new CSV iterator from a file.
filename: Path to the CSV filehasHeader: If true, treats the first row as column headers
Iterator function for range-over-func pattern. Use with for i, row := range it.Generate.
Note: when generate exits, Close is implicitly called.
Returns column headers if hasHeader was true in Open().
Returns any error encountered during iteration. Check after iteration completes.
Closes the underlying file. Always call this to prevent resource leaks.
- Go 1.23 or later (for range-over-func support)
name,age,pet,location
jeff,28,dog,seattle
jim,37,lizard,iceland
andy,17,cat,los angelesMIT