🐥

go言語を用いたCSVファイル操作

2022/02/27に公開

CSVファイルへの書き込み

主要な関数

os.Create("output.csv"):"output.csv"が存在しない場合は新たに作成して開く。既に存在している場合は、ファイルの中身を空にしてから開く。
w.Write(record):スライスrecordの中身をwへ書き込む。

package main

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

func main() {
	records := [][]string{
		{"first_name", "last_name", "username"},
		{"Rob", "Pike", "rob"},
		{"Ken", "Thompson", "ken"},
		{"Robert", "Griesemer", "gri"},
	}

	f, err := os.Create("output.csv")
	if err != nil {
		log.Fatal(err)
	}

	w := csv.NewWriter(f)

	for _, record := range records {
		if err := w.Write(record); err != nil {
			log.Fatalln("error writing record to csv:", err)
		}
	}

	// 書き込み処理
	w.Flush()

	if err := w.Error(); err != nil {
		log.Fatal(err)
	}
}

作成された"output.csv"の中身

first_name,last_name,username
Rob,Pike,rob
Ken,Thompson,ken
Robert,Griesemer,gri

CSVファイルからの読み込み

主要な関数

os.Open("input.csv"):"input.csv"を読み取り専用で開く。存在しない場合はエラーを返す。
r.Read():rから1行読み取る。読み取るデータが残っていない場合はnil,io.EOFを返す。

読み取りに利用する"input.csv"の中身

名前1,11才
名前2,12才
名前3,13才
名前4,14才
名前5,15才
package main

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

func main() {
	f, err := os.Open("input.csv")
	if err != nil {
		log.Fatal(err)
	}

	r := csv.NewReader(f)

	for {
		record, err := r.Read()
		if err == io.EOF {
			break
		}
		if err != nil {
			log.Fatal(err)
		}
		fmt.Println(record)
	}
}

実行結果

[名前1 11才]
[名前2 12才]
[名前3 13才]
[名前4 14才]
[名前5 15才]

Discussion