Trabalhando com CSV em Go (Golang): guia completo do pacote 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

Pacote encoding/csv em Go: guia completo para trabalhar com arquivos CSV



O formato CSV (Comma-Separated Values) continua sendo uma das formas mais populares de troca de dados tabulares. Em Go (Golang), para trabalhar com este formato, existe o pacote padrão encoding/csv, que fornece uma interface conveniente e eficiente para ler e escrever arquivos CSV. Neste artigo, abordaremos detalhadamente todos os recursos do pacote, desde operações básicas até técnicas avançadas.



Principais recursos do pacote encoding/csv

O pacote encoding/csv faz parte da biblioteca padrão do Go e não requer a instalação de dependências adicionais. Ele suporta:

  • Leitura de arquivos CSV com delimitadores configuráveis
  • Escrita de dados no formato CSV
  • Tratamento de aspas e escape de caracteres especiais
  • Trabalho com cabeçalhos de colunas
  • Leitura preguiçosa (processamento em fluxo de arquivos grandes)


Leitura de arquivos CSV em Go

Para ler um arquivo CSV, utiliza-se a estrutura csv.Reader. Vejamos um exemplo básico:



package main

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

func main() { // Abrindo o arquivo CSV file, err := os.Open("data.csv") if err != nil { log.Fatal("Erro ao abrir arquivo:", err) } defer file.Close()

// Criando um novo leitor CSV reader := csv.NewReader(file)

// Lendo todos os registros de uma vez records, err := reader.ReadAll() if err != nil { log.Fatal("Erro ao ler CSV:", err) }

// Exibindo os dados for i, record := range records { fmt.Printf("Linha %d: %v", i+1, record) }}


Leitura em fluxo de arquivos grandes

Para processar arquivos CSV grandes (centenas de megabytes ou mais), recomenda-se a leitura linha por linha:



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

reader := csv.NewReader(file) // Pulando o cabeçalho header, err := reader.Read() if err != nil { return err } fmt.Println("Cabeçalhos:", header)

// Lendo linha por linha lineCount := 0 for { record, err := reader.Read() if err != nil { break // Fim do arquivo } // Processando o registro fmt.Printf("Linha %d: %s | %s", lineCount+1, record[0], record[1]) lineCount++ } return nil}


Configuração do analisador CSV

O pacote encoding/csv permite configurar flexivelmente os parâmetros de leitura:

  • Comma — caractere delimitador (padrão é vírgula)
  • Comment — caractere de comentário (linhas iniciadas com ele são ignoradas)
  • FieldsPerRecord — número esperado de campos por registro
  • LazyQuotes — permitir aspas não escapadas
  • TrimLeadingSpace — remover espaços no início dos campos


func customCSVParser() {    file, _ := os.Open("custom.csv")    defer file.Close()

reader := csv.NewReader(file) reader.Comma = ';' // Usando ponto e vírgula reader.Comment = '#' // Linhas com # são ignoradas reader.TrimLeadingSpace = true reader.LazyQuotes = true

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


Escrita de dados no formato CSV

Para escrever, utiliza-se a estrutura csv.Writer. Exemplo de criação de arquivo CSV:



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

writer := csv.NewWriter(file) defer writer.Flush() // Importante! Descarrega o buffer no arquivo

// Escrevendo o cabeçalho

Recommendations