← YAML | Excelize →

GoCSV - Go CSV 处理

CSV 是常用的数据交换格式。Go 通过 encoding/csv 标准库和 gocarina/gocsv 等第三方库支持 CSV 的编解码。掌握 CSV 处理是开发数据导入导出功能的基础。

标准库

📝 encoding/csv 使用

package main

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

func main() {
    // 读取 CSV
    data := `name,age,city
Alice,30,Beijing
Bob,25,Shanghai
Carol,28,Guangzhou`
    
    reader := csv.NewReader(strings.NewReader(data))
    records, err := reader.ReadAll()
    if err != nil {
        panic(err)
    }
    
    // 遍历记录
    for i, record := range records {
        if i == 0 {
            fmt.Println("Headers:", record)
            continue
        }
        fmt.Printf("Row %d: %+v\n", i, record)
    }
    
    // 写入 CSV
    file, _ := os.Create("output.csv")
    defer file.Close()
    
    writer := csv.NewWriter(file)
    defer writer.Flush()
    
    writer.Write([]string{"name", "age", "city"})
    writer.Write([]string{"Alice", "30", "Beijing"})
    writer.Write([]string{"Bob", "25", "Shanghai"})
}

GoCSV 库

📝 结构体绑定

package main

import (
    "fmt"
    "strings"
    "github.com/gocarina/gocsv"
)

type User struct {
    Name string `csv:"name"`
    Age  int    `csv:"age"`
    City string `csv:"city"`
}

func main() {
    data := `name,age,city
Alice,30,Beijing
Bob,25,Shanghai`
    
    // 解析 CSV 到结构体切片
    var users []User
    if err := gocsv.UnmarshalString(data, &users); err != nil {
        panic(err)
    }
    
    for _, user := range users {
        fmt.Printf("%+v\n", user)
    }
    
    // 结构体切片转 CSV
    csv, _ := gocsv.MarshalString(users)
    fmt.Println(csv)
}

📖 延伸阅读