
日常中经常需要使用 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))
}
}

运行结果
