Trabajo con CSV en Go (Golang): guía completa de encoding/csv

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): guía completa



CSV (Comma-Separated Values) es uno de los formatos más comunes para el intercambio de datos tabulares. En el lenguaje Go (Golang), el trabajo con CSV se organiza a través del paquete estándar encoding/csv. Proporciona una interfaz conveniente y eficiente para leer y escribir archivos CSV, admite la configuración de delimitadores, escape de caracteres y manejo de errores.



En este artículo, analizaremos en detalle todas las capacidades del paquete encoding/csv con ejemplos prácticos. Aprenderá cómo leer archivos CSV línea por línea y completamente, escribir datos, configurar parámetros de análisis y manejar errores típicos.



Instalación e importación



El paquete encoding/csv está incluido en la biblioteca estándar de Go, por lo que no se requiere instalación adicional. Para usarlo, simplemente impórtelo en su código:



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


Lectura de archivos CSV



La forma más sencilla de leer un CSV es usar csv.NewReader y el método ReadAll, que devuelve todos los registros como un slice de slices 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 archivos grandes, es mejor usar la lectura línea por línea con el método Read para evitar cargar todo el archivo en memoria:



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 análisis flexible de comillas

for { record, err := reader.Read() if err != nil { break // fin del archivo o error } fmt.Println(record) }}


Escritura de archivos CSV



Para escribir datos se usa csv.NewWriter. El método Write escribe un registro, y WriteAll escribe todos de una vez. No olvide llamar a Flush() para vaciar el búfer.



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{ {"Nombre", "Edad", "Ciudad"}, {"Ana", "28", "Moscú"}, {"Iván", "35", "San Petersburgo"}, }

for _, record := range data { if err := writer.Write(record); err != nil { panic(err) } }}


Configuración del delimitador y escape



Por defecto, encoding/csv usa la coma como delimitador y las comillas dobles para el escape. Puede cambiar estas configuraciones a través de los campos de las estructuras Reader y Writer:



func customSettings() {    // Lectura de TSV (Tab-Separated Values)    file, _ := os.Open("data.tsv")    defer file.Close()

reader := csv.NewReader(file) reader.Comma = '\\t' // tabulación en lugar de coma reader.Comment = '#' // ignorar líneas que comienzan con #

records, _ := reader.ReadAll() fmt.Println(records)}


Campos útiles para la configuración:

  • Comma — carácter delimitador (por defecto ',')
  • Comment — carácter de comentario (las líneas que comienzan con este carácter se ignoran)
  • LazyQuotes — permite análisis flexible de comillas
  • TrimLeadingSpace — elimina espacios al inicio de los campos
  • FieldsPerRecord — número esperado de campos por registro

Recommendations