Trabalhando com CSV em Go (Golang): guia completo para encoding/csv

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com CSV em Go (Golang): guia completo



CSV (Comma-Separated Values) é um dos formatos mais comuns para troca de dados tabulares. Na linguagem Go (Golang), o trabalho com CSV é organizado através do pacote padrão encoding/csv. Ele fornece uma interface conveniente e eficiente para leitura e escrita de arquivos CSV, suporta configuração de delimitadores, escape de caracteres e tratamento de erros.



Neste artigo, vamos detalhar todos os recursos do pacote encoding/csv com exemplos práticos. Você aprenderá como ler arquivos CSV linha por linha e por completo, escrever dados, configurar parâmetros de parsing e tratar erros típicos.



Instalação e importação



O pacote encoding/csv faz parte da biblioteca padrão do Go, portanto, nenhuma instalação adicional é necessária. Para usá-lo, basta importá-lo no seu código:



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


Leitura de arquivos CSV



A maneira mais simples de ler um CSV é usar csv.NewReader e o método ReadAll, que retorna todos os registros como uma fatia de fatias de strings.



func readAllExample(filename string) {    file, err := os.Open(filename)    if err != nil {        panic(err)    }    defer file.Close()

reader := csv.NewReader(file) records, err := reader.ReadAll() if err != nil { panic(err) }

for _, record := range records { fmt.Println(record) }}


Para arquivos grandes, é melhor usar a leitura linha por linha através do método Read, para evitar carregar todo o arquivo na memória:



func readLineByLine(filename string) {    file, err := os.Open(filename)    if err != nil {        panic(err)    }    defer file.Close()

reader := csv.NewReader(file) reader.LazyQuotes = true // permite parsing não rigoroso de aspas

for { record, err := reader.Read() if err != nil { break // fim do arquivo ou erro } fmt.Println(record) }}


Escrita de arquivos CSV



Para escrever dados, usa-se csv.NewWriter. O método Write escreve um registro, e WriteAll escreve todos de uma vez. Não se esqueça de chamar Flush() para liberar o buffer.



func writeExample(filename string) {    file, err := os.Create(filename)    if err != nil {        panic(err)    }    defer file.Close()

writer := csv.NewWriter(file) defer writer.Flush()

data := [][]string{ {"Nome", "Idade", "Cidade"}, {"Ana", "28", "Moscou"}, {"Ivan", "35", "São Petersburgo"}, }

for _, record := range data { if err := writer.Write(record); err != nil { panic(err) } }}


Configuração do delimitador e escape



Por padrão, encoding/csv usa vírgula como delimitador e aspas duplas para escape. Você pode alterar essas configurações através dos campos das structs Reader e Writer:



func customSettings() {    // Leitura de TSV (Tab-Separated Values)    file, _ := os.Open("data.tsv")    defer file.Close()

reader := csv.NewReader(file) reader.Comma = '\\t' // tabulação em vez de vírgula reader.Comment = '#' // ignorar linhas que começam com #

records, _ := reader.ReadAll() fmt.Println(records)}


Campos úteis para configuração:

  • Comma — caractere delimitador (padrão ',')
  • Comment — caractere de comentário (linhas com este caractere no início são ignoradas)
  • LazyQuotes — permite parsing não rigoroso de aspas
  • TrimLeadingSpace — remove espaços no início dos campos
  • FieldsPerRecord — número esperado de campos por registro

Recommendations