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 aspasTrimLeadingSpace— remove espaços no início dos camposFieldsPerRecord— número esperado de campos por registro
Também na biblioteca
Trabalhando com ZIP/arquivos em Go (Golang) — guia completo
Trabalhando com Excel em C# (.NET): bibliotecas EPPlus, ClosedXML e NPOI
Validação de dados em PHP: guia completo com exemplos de código
Agendador de Tarefas Swift: GCD, OperationQueue e Combine para iOS/macOS