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 registroLazyQuotes— permitir aspas não escapadasTrimLeadingSpace— 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