Go – File Handling
Estimated reading: 4 minutes 27 views

📊 Go – Read CSV Files with encoding/csv: Syntax, Parsing & Examples (2025 Guide)

🧲 Introduction – Why Read CSV Files in Go?

CSV (Comma-Separated Values) files are widely used to store tabular data in a simple, portable format. In Go, the encoding/csv package provides a clean and efficient way to read and parse CSV files for use in data processing, ETL pipelines, report generation, and backend APIs.

🎯 In this guide, you’ll learn:

  • How to read and parse CSV files using Go
  • Handle headers and row iteration
  • Convert CSV rows into structs
  • Best practices for validation and error handling

✅ Basic Example – Read CSV File Line by Line

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"
)

func main() {
    file, err := os.Open("data.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    reader := csv.NewReader(file)

    for {
        record, err := reader.Read()
        if err != nil {
            break
        }
        fmt.Println(record)
    }
}

📤 Sample Output (for data.csv):

["John" "30" "Engineer"]  
["Alice" "25" "Designer"]

✅ Each record is a slice of strings, representing one row of data.


🧾 Read All CSV Rows at Once

records, err := reader.ReadAll()
if err != nil {
    log.Fatal(err)
}

for _, row := range records {
    fmt.Println(row)
}

ReadAll() loads the entire file. Use it only for small/medium-sized files.


🏷️ CSV With Headers – Skip the First Row

reader := csv.NewReader(file)
reader.FieldsPerRecord = -1 // Optional: Allow variable columns

// Read the first row as headers
headers, err := reader.Read()
if err != nil {
    log.Fatal(err)
}

fmt.Println("Headers:", headers)

for {
    record, err := reader.Read()
    if err != nil {
        break
    }
    fmt.Println(record)
}

✅ This skips the header row and processes the actual data.


📦 Mapping CSV Rows to Structs

type Person struct {
    Name string
    Age  string
    Job  string
}

func main() {
    file, _ := os.Open("data.csv")
    defer file.Close()
    reader := csv.NewReader(file)
    reader.Read() // skip header

    var people []Person

    for {
        record, err := reader.Read()
        if err != nil {
            break
        }
        p := Person{
            Name: record[0],
            Age:  record[1],
            Job:  record[2],
        }
        people = append(people, p)
    }

    fmt.Println(people)
}

✅ A basic way to map each row to a struct manually.


🛠️ Real-World Use Case – Filtering CSV by Column

for {
    record, err := reader.Read()
    if err != nil {
        break
    }
    if record[2] == "Engineer" {
        fmt.Println("Engineer:", record[0])
    }
}

✅ Filter data on-the-fly without loading the entire file.


📛 Handle Errors & EOF Gracefully

for {
    record, err := reader.Read()
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(record)
}

✅ Always check for io.EOF to stop reading gracefully.


🧠 Best Practices

PracticeWhy It Matters
✅ Use defer file.Close()Properly releases resources
✅ Use reader.Read() for controlMore flexible than ReadAll()
❌ Avoid ReadAll() on huge filesMay cause memory exhaustion
✅ Validate data column lengthPrevents index out of range errors
✅ Define constants for column indexesImproves readability and maintainability

📌 Summary – Recap & Next Steps

Go’s encoding/csv package offers a powerful and clean way to parse CSV files. You can handle headers, read line-by-line or all at once, and map rows to structs for easier data handling.

🔍 Key Takeaways:

  • Use csv.NewReader(file) and reader.Read() to parse rows
  • Handle headers manually by skipping or storing them
  • Validate and map data using struct fields
  • Avoid ReadAll() for large CSV files

⚙️ Next: Explore Writing CSV Files, CSV Field Validation, or Building a CSV-to-JSON Converter in Go.


❓ FAQs – Go Read CSV Files

❓ How do I read a CSV file with headers?
✅ Use reader.Read() to read and optionally skip the header row.

❓ What does ReadAll() do?
✅ It reads all remaining records into memory—good for small files.

❓ How can I convert CSV rows to structs?
✅ Manually assign each field in a loop, or use a CSV-to-struct helper package.

❓ Can I use tabs instead of commas in CSV?
✅ Use reader.Comma = '\t' to change the delimiter (e.g., for TSV files).

❓ Is encoding/csv safe for concurrent use?
❌ No. It’s not safe for concurrent reads. Protect it with locks if needed.


Share Now :

Leave a Reply

Your email address will not be published. Required fields are marked *

Share

Go Read CSV Files

Or Copy Link

CONTENTS
Scroll to Top