0Pricing
Go Academy · レッスン

encoding/csv

CSVを読み書きします

「encoding/csv」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

CSVとは

CSV(カンマ区切り値)は、表形式のデータをプレーンテキストで格納します。1行に1レコードを記述し、フィールドをカンマで区切ります。Goのencoding/csvパッケージで読み書きできます。

文字列からの読み取り

任意のio.Readerからリーダーを作成できます。strings.NewReaderは文字列をラップするため、ファイルなしで動作を確認できます。

package main

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

func main() {
	r := csv.NewReader(strings.NewReader("a,b,c"))
	rec, _ := r.Read()
	fmt.Println(rec)
}

すべてのレコードを読み取る

ReadAllはすべての行を[][]stringに読み込みます。内側の各スライスが、1つのレコードのフィールドになります。

package main

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

func main() {
	data := "name,age\nAnn,30\nBob,25"
	r := csv.NewReader(strings.NewReader(data))
	records, _ := r.ReadAll()
	fmt.Println(records)
}

行ごとに読み取る

大きなファイルでは、Readを使って1回に1レコードずつ読み取ります。読み取りが完了するとio.EOFを返します。

package main

import (
	"encoding/csv"
	"fmt"
	"io"
	"strings"
)

func main() {
	r := csv.NewReader(strings.NewReader("a,1\nb,2"))
	for {
		rec, err := r.Read()
		if err == io.EOF {
			break
		}
		fmt.Println(rec)
	}
}

フィールドへのアクセス

各レコードは文字列のスライスです。インデックスを指定して列を読み取ります。

package main

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

func main() {
	r := csv.NewReader(strings.NewReader("Ann,30"))
	rec, _ := r.Read()
	fmt.Println("name:", rec[0], "age:", rec[1])
}

区切り文字の変更

r.Commaを設定すると、セミコロンやタブなど、別の区切り文字を使用できます。

package main

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

func main() {
	r := csv.NewReader(strings.NewReader("a;b;c"))
	r.Comma = ';'
	rec, _ := r.Read()
	fmt.Println(rec)
}

CSVの書き込み

csv.NewWriterはレコードを書き込みます。バッファに溜まったデータを出力するにはFlushを呼び出します。

package main

import (
	"encoding/csv"
	"os"
)

func main() {
	w := csv.NewWriter(os.Stdout)
	w.Write([]string{"name", "age"})
	w.Write([]string{"Ann", "30"})
	w.Flush()
}

複数行の書き込み

WriteAllは[][]string全体を一度に書き込み、自動的にフラッシュします。

package main

import (
	"encoding/csv"
	"os"
)

func main() {
	w := csv.NewWriter(os.Stdout)
	rows := [][]string{{"a", "1"}, {"b", "2"}}
	w.WriteAll(rows)
}

自動的な引用符付け

ライターは、カンマ、引用符、改行を含むフィールドを引用符で囲むため、出力は有効なCSVのまま保たれます。

package main

import (
	"encoding/csv"
	"os"
)

func main() {
	w := csv.NewWriter(os.Stdout)
	w.Write([]string{"hello, world", "plain"})
	w.Flush()
}

Flushを忘れない

ライターはデータをバッファリングします。Flushを忘れると(WriteAllを使わない場合)、一部の行が書き込まれないことがあります。プログラムが終了する前に必ずフラッシュしてください。

エラー処理

フラッシュした後、w.Error()を確認して、バッファリング中に発生した書き込みエラーを検出します。

package main

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

func main() {
	w := csv.NewWriter(os.Stdout)
	w.Write([]string{"x", "y"})
	w.Flush()
	fmt.Fprintln(os.Stderr, w.Error())
}

クイックチェック

CSVリーダーのReadAllは、解析したデータをどのような型で返しますか?

まとめ

encoding/csvには次の特徴があります。

  • csv.NewReaderとReadまたはReadAllを使います
  • csv.NewWriterでWrite/WriteAllを使い、その後Flushを呼び出します
  • Commaで区切り文字を変更でき、引用符付けは自動的に行われます

よくある質問

「encoding/csv」レッスンは無料ですか?

はい。「encoding/csv」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「encoding/csv」で何を学びますか?

CSVを読み書きします ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「encoding/csv」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. encoding/jsonのおさらい
  2. encoding/xml
  3. encoding/csv
  4. gobとバイナリエンコーディング
← Go Academyに戻る