0Pricing
Go Academy · Урок

encoding/csv

Читайте и записывайте CSV

«encoding/csv» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое CSV

CSV (значения, разделённые запятыми) хранит табличные данные в виде обычного текста: одна запись в каждой строке, поля разделены запятыми. Пакет 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. Каждый вложенный срез содержит поля одной записи.

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. После завершения метод возвращает 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())
}

Быстрая проверка

Что возвращает ReadAll средства чтения CSV для разобранных данных?

Итоги

encoding/csv:

  • csv.NewReader вместе с Read или ReadAll
  • csv.NewWriter вместе с Write/WriteAll, затем Flush
  • Задайте Comma для пользовательских разделителей; заключение в кавычки выполняется автоматически

Часто задаваемые вопросы

Урок «encoding/csv» бесплатный?

Да — полный текст урока «encoding/csv» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «encoding/csv»?

Читайте и записывайте CSV Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 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