Golang 內建 CSV 的檔案處理功能,本篇介紹 csv.Writer 及簡單的使用範例。

csv.Writercsv.Reader 一樣是一個 struct ,該 struct 只定義 2 個屬性(field) ,分別為 Comma 以及 UseCRLFComma 設定 CSV 檔案的分隔符號,如果用 csv.NewWriter 取得這個 struct 時, Comma 會被自動設定為 , ;而 UseCRLF 是個 boolean ,代表是否要使用 \r\n 作為斷行,用 csv.NewWriter 取得時預設是 true 代表用 \r\n 作為斷行:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)

func main() {
    w := csv.NewWriter(os.Stdout)
    fmt.Println(string(w.Comma))
    fmt.Println(w.UseCRLF)
}

上述範例執行結果:

,
false

認識 csv.Writer struct 之後,就能夠進一步認識 Write 函式,Wirte 函式每次只寫入一行,因此該函式接受 1 個 []string 作為傳入值, slice 中的每一個元素就是一個欄位的值。

例如:

package main

import (
    "encoding/csv"
    "os"
)

func main() {
    records := [][]string{
        {"Rob", "Pike", "rob"},
        {"Ken", "Thompson", "ken"},
    }

    w := csv.NewWriter(os.Stdout)
    for _, record := range records {
        w.Write(record)
    }
    w.Flush()
}

上述範例執行結果為:

Rob,Pike,rob
Ken,Thompson,ken

值得注意的是 w.Flush() 會保證所有在 buffer 中的資料會被寫入,避免有些資料還存在 buffer 中,有興趣可以在 Go Playground 中試試沒有這行的效果。

除了 Write 函式之外,還有一個 WriteAll 函式,該函式如其名,一次寫入所有的行,所以該函式接受 [][]string 作為傳入值,同時會在執行寫入完成之後幫忙呼叫 Flush() ,如果沒有很大量的資料要一次寫入的話,可以考慮使用 WriteAll ,能夠少寫一行。

以上就是 csv.Writer 的介紹了。 Happy Coding!

References

https://golang.org/pkg/encoding/csv/#Writer.Write

https://golang.org/src/encoding/csv/writer.go?s=2606:2657#L103