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