Trabajo con CSV en Go (Golang): guía completa de análisis y escritura

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con CSV en Go (Golang): análisis, escritura y procesamiento de datos

CSV (Comma-Separated Values) es uno de los formatos más comunes para el intercambio de datos tabulares. En Go (Golang), el trabajo con CSV se implementa de forma nativa a través del paquete estándar encoding/csv, lo que lo convierte en una herramienta conveniente y eficiente. En este artículo, analizaremos en detalle cómo leer, crear y procesar archivos CSV en Go, incluyendo el trabajo con grandes volúmenes de datos, la configuración de delimitadores y el manejo de errores.



Paquete encoding/csv: fundamentos

El paquete encoding/csv proporciona dos tipos principales: Reader para leer CSV y Writer para escribir. Admite las reglas estándar de CSV (RFC 4180) y permite configurar de manera flexible parámetros como el delimitador, los comentarios y el manejo de comillas.

Para empezar, basta con importar el paquete:

import "encoding/csv"


Lectura de un archivo CSV

Veamos un ejemplo sencillo de lectura de un archivo CSV línea por línea:

package main

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

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

// Creamos un Reader reader := csv.NewReader(file)

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

// Mostramos los datos for i, record := range records { fmt.Printf("Fila %d: %v", i, record) }}

Importante: ReadAll() carga todo el archivo en memoria. Para archivos grandes, use la lectura línea por línea con Read().



Lectura línea por línea de archivos CSV grandes

Para procesar grandes volúmenes de datos (gigabytes), use la lectura iterativa:

reader := csv.NewReader(file)for {    record, err := reader.Read()    if err != nil {        // Fin del archivo        if err.Error() == "EOF" {            break        }        panic(err)    }    // Procesamos el registro    fmt.Println(record)}


Escritura en un archivo CSV

La creación de un archivo CSV también es intuitiva:

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: vaciamos el búfer

// Escribimos los encabezados writer.Write([]string{"Name", "Age", "City"}) // Escribimos los datos writer.Write([]string{"Alice", "30", "Moscow"}) writer.Write([]string{"Bob", "25", "Saint Petersburg"})}

No olvide llamar a Flush() después de todas las operaciones de escritura, de lo contrario los datos podrían perderse.



Configuración del delimitador y otros parámetros

Por defecto se usa la coma, pero puede cambiar el delimitador, por ejemplo, a punto y coma (TSV — tabulación):

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

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

Otros parámetros útiles:

  • LazyQuotes — permite comillas en lugares no estándar (por defecto false)
  • FieldsPerRecord — verificación del número de campos (un valor negativo desactiva la verificación)
  • Comment — carácter de comentario (por ejemplo, '#'), las líneas que lo contienen se omiten
  • TrimLeadingSpace — eliminación automática de espacios al inicio de los campos

Ejemplo con configuraciones:

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


Manejo de errores y validación

Los archivos CSV a menudo contienen errores: comillas sobrantes, discrepancia en la cantidad

Recommendations