日常中经常需要使用 golang 读写 csv 文件,比如将数据库中的数据按照要求导出到 csv 中,读取 csv 文件中的数据到内存中进行处理等操作。
ps: 如果是 Excel 文件(*.xlsm、.xls、.xlt 等格式结尾),需要将其另存为 .csv 格式的文件,才能操作。
package main import ( "bufio" "encoding/csv" "fmt" "io" "os" ) var fileName = "./test.csv" func main() { writeFile() readFile() } func writeFile() { file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0644) if err != nil { fmt.Println("open file is failed, err: ", err) } defer file.Close() // 写入UTF-8 BOM,防止中文乱码 file.WriteString("\xEF\xBB\xBF") w := csv.NewWriter(file) w.Write([]string{"开发者名称", "开发者邮箱", "应用名称"}) w.Write([]string{"Ann", "Ann@126.com", "开心消消乐"}) w.Write([]string{"Jony", "Jony@126.com", "微信"}) // 写文件需要flush,不然缓存满了,后面的就写不进去了,只会写一部分 w.Flush() } func readFile() { // 必须关闭文件后重新打开,才会读出刚才写入的数据 file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0644) if err != nil { fmt.Println("open file is failed, err: ", err) } defer file.Close() r := bufio.NewReader(file) for { b, err := r.ReadBytes('n') // 会把一行中最后的 n 也读取出来,可以使用 TrimSpace 清空 n // b = bytes.TrimSpace(b) // b, err := buf.ReadString('n') if err != nil { if err == io.EOF { break } fmt.Println("err = ", err) return } fmt.Println(string(b)) } }
运行结果