Trabalhando com CSV em Go (Golang): guia completo para parsing e escrita

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): parsing, escrita e processamento de dados

CSV (Comma-Separated Values) — um dos formatos mais comuns para troca de dados tabulares. Em Go (Golang), o trabalho com CSV é implementado nativamente através do pacote padrão encoding/csv, tornando-o uma ferramenta conveniente e eficiente. Neste artigo, abordaremos detalhadamente como ler, criar e processar arquivos CSV em Go, incluindo trabalho com grandes volumes de dados, configuração de delimitadores e tratamento de erros.



Pacote encoding/csv: fundamentos

O pacote encoding/csv fornece dois tipos principais: Reader para leitura de CSV e Writer para escrita. Ele suporta as regras padrão de CSV (RFC 4180) e permite configurar flexivelmente parâmetros como delimitador, comentários e tratamento de aspas.

Para começar, basta importar o pacote:

import "encoding/csv"


Leitura de arquivo CSV

Vamos considerar um exemplo simples de leitura de arquivo CSV linha por linha:

package main

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

func main() { // Abrindo o arquivo file, err := os.Open("data.csv") if err != nil { panic(err) } defer file.Close()

// Criando o Reader reader := csv.NewReader(file)

// Lendo todos os registros records, err := reader.ReadAll() if err != nil { panic(err) }

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

Importante: ReadAll() carrega todo o arquivo na memória. Para arquivos grandes, use leitura linha por linha com Read().



Leitura linha por linha de grandes arquivos CSV

Para processar grandes volumes de dados (gigabytes), use leitura iterativa:

reader := csv.NewReader(file)for {    record, err := reader.Read()    if err != nil {        // Fim do arquivo        if err.Error() == "EOF" {            break        }        panic(err)    }    // Processando o registro    fmt.Println(record)}


Escrita em arquivo CSV

Criar um arquivo CSV também é intuitivo:

package main

import ( "encoding/csv" "os")

func main() { file, err := os.Create("output.csv") if err != nil { panic(err) } defer file.Close()

writer := csv.NewWriter(file) defer writer.Flush() // Importante: descarregar o buffer

// Escrevendo cabeçalhos writer.Write([]string{"Nome", "Idade", "Cidade"}) // Escrevendo dados writer.Write([]string{"Alice", "30", "Moscou"}) writer.Write([]string{"Bob", "25", "São Petersburgo"})}

Não se esqueça de chamar Flush() após todas as operações de escrita, caso contrário os dados podem ser perdidos.



Configuração do delimitador e outros parâmetros

Por padrão, usa-se vírgula, mas você pode alterar o delimitador, por exemplo, para ponto e vírgula (TSV — tabulação):

reader := csv.NewReader(file)reader.Comma = ';'  // Para TSV: '\\t'

// Para escrita:writer := csv.NewWriter(file)writer.Comma = ';'

Outros parâmetros úteis:

  • LazyQuotes — permite aspas em locais não padrão (padrão false)
  • FieldsPerRecord — verificação do número de campos (valor negativo desativa a verificação)
  • Comment — caractere de comentário (ex.: '#'), linhas com ele são ignoradas
  • TrimLeadingSpace — remoção automática de espaços no início dos campos

Exemplo com configurações:

reader := csv.NewReader(file)reader.Comma = '\\t'reader.Comment = '#'reader.TrimLeadingSpace = true


Tratamento de erros e validação

Arquivos CSV frequentemente contêm erros: aspas extras, incompatibilidade de quan

Recommendations