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]