日常中經常需要使用 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)) } }
運行結果