Go 操作 csv 简易指北

仅仅只是介绍一下简单使用以及遇到的两个坑

  • 使用 csv.Reader 时可以选择设置 LazyQuotes ,这样遇到如下的 csv 就不会报 bare “ in non-quoted-field 的错 了:
1
2
3
4
5
6
  csvData := `d"ata1,data2,data3
data4,da"ta5,data6`
reader := csv.NewReader(strings.NewReader(csvData))
reader.LazyQuotes = true
r, err := reader.ReadAll()
fmt.Println(r, err)
  • 使用 csv.Writer 最后记得 Flush,因为其底层使用到了 buffer,最后需要将 buffer 中的数据全部写到目标位置
1
2
3
4
writer.Flush()
if err := writer.Error(); err != nil {
// ....
}

基本操作

从网络流中读取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
resp, _ := http.Get("xxxxx")
defer resp.Body.Close()
reader := csv.NewReader(resp.Body)
reader.LazyQuotes = true
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
// handle err
continue
}
// handle record
_ = record
}

写 csv 文件

1
2
3
4
5
6
7
f, _ := os.OpenFile("data.txt", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0600)
defer f.Close()
writer := csv.NewWriter(f)
_ = writer.Write([]string{"....", "...."})
_ = writer.Write([]string{"....", "...."})
writer.Flush()
_ = writer.Error()