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 = trueTratamento de erros e validação
Arquivos CSV frequentemente contêm erros: aspas extras, incompatibilidade de quan
Também na biblioteca
Geração de PDF em C# (.NET): Guia Completo de Bibliotecas
Testes em Java: frameworks e ferramentas (JUnit, TestNG, Mockito)
BenchmarkDotNet para C# (.NET): guia completo com exemplos
Filas de Tarefas em Kotlin: Coroutines, KJob e Padrões Avançados