Paquete encoding/csv en Go: guía completa para trabajar con archivos CSV
El formato CSV (Valores Separados por Comas) sigue siendo una de las formas más populares de intercambiar datos tabulares. En Go (Golang) para trabajar con este formato existe el paquete estándar encoding/csv, que proporciona una interfaz conveniente y eficiente para leer y escribir archivos CSV. En este artículo, analizaremos en detalle todas las capacidades del paquete, desde operaciones básicas hasta técnicas avanzadas.
Capacidades principales del paquete encoding/csv
El paquete encoding/csv forma parte de la biblioteca estándar de Go y no requiere la instalación de dependencias adicionales. Soporta:
- Lectura de archivos CSV con delimitadores configurables
- Escritura de datos en formato CSV
- Manejo de comillas y escape de caracteres especiales
- Trabajo con encabezados de columnas
- Lectura diferida (procesamiento en flujo de archivos grandes)
Lectura de archivos CSV en Go
Para leer un archivo CSV se utiliza la estructura csv.Reader. Veamos un ejemplo básico:
package main
import ( "encoding/csv" "fmt" "log" "os")
func main() { // Abrimos el archivo CSV file, err := os.Open("data.csv") if err != nil { log.Fatal("Error al abrir el archivo:", err) } defer file.Close()
// Creamos un nuevo lector CSV reader := csv.NewReader(file)
// Leemos todos los registros de una vez records, err := reader.ReadAll() if err != nil { log.Fatal("Error al leer CSV:", err) }
// Mostramos los datos for i, record := range records { fmt.Printf("Fila %d: %v", i+1, record) }}Lectura en flujo de archivos grandes
Para procesar archivos CSV grandes (cientos de megabytes o más) se recomienda usar la lectura línea por línea:
func readLargeCSV(filename string) error { file, err := os.Open(filename) if err != nil { return err } defer file.Close()
reader := csv.NewReader(file) // Saltamos el encabezado header, err := reader.Read() if err != nil { return err } fmt.Println("Encabezados:", header)
// Leemos línea por línea lineCount := 0 for { record, err := reader.Read() if err != nil { break // Fin del archivo } // Procesamos el registro fmt.Printf("Fila %d: %s | %s", lineCount+1, record[0], record[1]) lineCount++ } return nil}Configuración del analizador CSV
El paquete encoding/csv permite configurar de forma flexible los parámetros de lectura:
Comma— carácter delimitador (por defecto coma)Comment— carácter de comentario (las líneas que comienzan con él se ignoran)FieldsPerRecord— número esperado de campos por registroLazyQuotes— permitir comillas sin escaparTrimLeadingSpace— eliminar espacios al inicio de los campos
func customCSVParser() { file, _ := os.Open("custom.csv") defer file.Close()
reader := csv.NewReader(file) reader.Comma = ';' // Usamos punto y coma reader.Comment = '#' // Las líneas con # se ignoran reader.TrimLeadingSpace = true reader.LazyQuotes = true
records, _ := reader.ReadAll() for _, record := range records { fmt.Println(record) }}Escritura de datos en formato CSV
Para escribir se utiliza la estructura csv.Writer. Ejemplo de creación de un archivo 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! Vaciamos el búfer al archivo
// Escribimos el encabezado También en la biblioteca
Newtonsoft.Json para C# (.NET): guía completa con ejemplos
Trabajo con Kafka en Java: bibliotecas, configuración y ejemplos de código
Trabajo con YAML en Swift (iOS/macOS) — bibliotecas Yams y YamlSwift
Trabajo con Markdown en Node.js: bibliotecas y herramientas para conversión
Bcrypt en JavaScript (Node.js): guía completa con ejemplos