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 = trueManejo de errores y validación
Los archivos CSV a menudo contienen errores: comillas sobrantes, discrepancia en la cantidad