Go语言处理CSV数据
csv(Comma-Seperated Vaules), 指以纯文本形式存储表格数据(https://www.rfc-editor.org/rfc/rfc4180.html)。Go语言内置包encoding/csv用来处理csv数据。
写入csv文件:
import (
"encoding/csv"
"fmt"
"os"
)
func generateCsv(file *os.File, data []string) error {
// NewWriter返回一个Writer对象
writer := csv.NewWriter(file)
// 调用Write方法将数据写入文件
err := writer.Write(data)
if err != nil {
return err
}
writer.Flush()
return nil
}
func main() {
var data = map[string][]string{
"row1": {"id", "name", "score"},
"row2": {"001", "Jack", "95"},
"row3": {"002", "John", "73"},
"row4": {"003", "Robert", "99"},
}
// os.Create创建文件,创建成功则返回文件指针对象*File
f, err := os.Create("data.csv")
if err != nil {
return
}
defer func(file *os.File) {
err := f.Close()
if err != nil {
fmt.Println(err)
}
}(f)
rowsArray := []string{"row1", "row2", "row3", "row4"}
for _, row := range rowsArray {
r, ok := data[row]
if !ok {
return
}
err := generateCsv(f, r)
if err != nil {
fmt.Println(err)
return
}
}
}
读取csv文件:
import (
"encoding/csv"
"fmt"
"io"
"os"
"path/filepath"
)
func main() {
// os.Open打开文件,如果打开成功返回一个文件指针对象*File
// filepath.Join会自动根据操作系统类型将路径拼接到一起,提高代码健壮性
f, err := os.Open(filepath.Join("data.csv"))
if err != nil {
fmt.Println(err)
return
}
defer func(f *os.File) {
err := f.Close()
if err != nil {
fmt.Println(err)
}
}(f)
// NewReader()返回一个Reader结构体
reader := csv.NewReader(f)
// 设置字段分隔符。此处为什么采用英文分号";"?因为Reader默认分隔符是因为逗号,此处覆盖默认分隔符(也可以
// 其他符号,必须是有效的rune类型符号并且不能使用换行”\n或者\r\n“),使其原样输出csv文件内容
reader.Comma = ';'
for {
r, err := reader.Read()
if err != nil {
if err == io.EOF {
break
} else {
fmt.Println(err)
break
}
}
fmt.Println(r)
}
}
// [id,name,score]
// [001,Jack,95]
// [002,John,73]
// [003,Robert,99]
查看5道真题和解析