whyrusleeping/csv

A small utility package implementing a golang iterator for csv files

★ 0Forks 0GoGitHub ↗Compare

README

CSV Iterator

A simple Go package that provides syntactic sugar for working with CSV files using Go 1.23's new range-over-func feature.

Installation

go get github.com/whyrusleeping/csv

Usage

Basic Usage

package 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)
    }
}

Working with Headers

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])
}

Without Headers

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)
}

API Reference

Open(filename string, hasHeader bool) (*Iterator, error)

Creates a new CSV iterator from a file.

  • filename: Path to the CSV file
  • hasHeader: If true, treats the first row as column headers

(*Iterator) Generate(yield func(int, []string) bool)

Iterator function for range-over-func pattern. Use with for i, row := range it.Generate. Note: when generate exits, Close is implicitly called.

(*Iterator) Headers() []string

Returns column headers if hasHeader was true in Open().

(*Iterator) Error() error

Returns any error encountered during iteration. Check after iteration completes.

(*Iterator) Close() error

Closes the underlying file. Always call this to prevent resource leaks.

Requirements

  • Go 1.23 or later (for range-over-func support)

Example CSV File

name,age,pet,location
jeff,28,dog,seattle
jim,37,lizard,iceland
andy,17,cat,los angeles

License

MIT

Contributors

whyrusleeping

Issues