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 comillasTrimLeadingSpace— elimina espacios al inicio de los camposFieldsPerRecord— número esperado de campos por registro
También en la biblioteca
Laravel Framework para PHP: guía completa con ejemplos
Generación de informes PDF en Swift para iOS y macOS con PDFKit y Core Graphics
Cliente OAuth para Swift (iOS/macOS): biblioteca OAuthSwift
Guía completa de Drogon para C++ con ejemplos
Redis (ioredis) para JavaScript (Node.js): guía completa con ejemplos