csvkit: una caja de herramientas para trabajar con CSV desde la terminal

Te llega un fichero CSV. Antes de cargarlo en una base de datos, quieres saber qué columnas tiene, si faltan valores y qué registros te interesan. Abrir una hoja de cálculo funciona, pero resulta poco cómodo cuando tienes que repetir la misma operación con varios archivos. Escribir un programa para cada comprobación tampoco siempre compensa.
csvkit reúne herramientas de línea de comandos para convertir y procesar datos tabulares. Está escrito en Python y permite resolver muchas de esas tareas con instrucciones breves que puedes guardar y ejecutar de nuevo.
Un CSV tiene más estructura de la que parece
Separar una línea por comas puede parecer suficiente hasta que aparece un valor como "Madrid, centro". También puede haber comillas escapadas o saltos de línea dentro de un campo. Por eso, usar cut, grep o sort directamente sobre el texto requiere cuidado: esas herramientas no interpretan por sí mismas la estructura de un CSV.
csvkit trabaja con filas y columnas. Puedes pedir una columna por su nombre, filtrar un campo concreto y encadenar operaciones mediante |. La salida sigue siendo CSV en los comandos de transformación; csvlook, en cambio, genera una tabla para leer en pantalla. El tutorial oficial explica este uso de la entrada y salida estándar.
Instalación
La documentación recomienda instalarlo en un entorno virtual. En Linux o macOS:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install csvkit
csvcut --version
En PowerShell, la activación se hace con .venv\Scripts\Activate.ps1. La instalación incorpora varios ejecutables, como csvcut y csvstat: no hay que invocar un único comando llamado csvkit.
Un ejemplo que puedes reproducir
Guarda este contenido como ventas.csv, en UTF-8:
id,cliente,categoria,unidades,precio,estado
1,"Librería Norte",libros,2,18.50,pagado
2,"Café, Central",hogar,1,32.00,pendiente
3,"Librería Norte",libros,3,12.00,pagado
4,"Estudio Sur",hogar,2,25.00,pagado
La coma en "Café, Central" pertenece al nombre del cliente, no separa dos columnas.
Inspeccionar antes de transformar
csvcut -n ventas.csv
csvlook ventas.csv
csvstat ventas.csv
csvstat --count ventas.csv
csvcut -n enumera las columnas y csvlook facilita la lectura. csvstat resume tipos inferidos, valores nulos y estadísticas según el tipo de cada columna. El último comando devuelve 4: cuenta registros, no líneas físicas del fichero. Esta distinción importa cuando los campos contienen saltos de línea.
Elegir columnas y filtrar filas
csvgrep -c estado -r '^pagado$' ventas.csv \
| csvcut -c cliente,categoria,unidades,precio \
> ventas_pagadas.csv
csvsort -c precio -r ventas_pagadas.csv | csvlook
csvgrep aplica la expresión regular a la columna estado. Las anclas ^ y $ hacen que coincida con el contenido completo del campo. Después seleccionamos cuatro columnas y guardamos el resultado. csvsort ordena por precio de mayor a menor; aquí los precios se interpretan como números.
La tubería conecta la salida de un comando con la entrada del siguiente. > escribe esa salida en un fichero y sobrescribe su contenido si ya existe. Usa un nombre distinto al archivo de entrada para no truncarlo antes de leerlo.
Agregar con SQL
Para calcular el importe de las ventas pagadas por categoría:
csvsql --query "
SELECT categoria,
SUM(unidades * precio) AS importe
FROM ventas
WHERE estado = 'pagado'
GROUP BY categoria
ORDER BY importe DESC
" ventas.csv
El resultado suma 73 en libros y 50 en hogar; su representación decimal puede variar. Por defecto, el nombre de la tabla procede del fichero sin su extensión: ventas.csv se convierte en ventas.
csvsql carga los datos en una base SQLite en memoria para ejecutar esta consulta. También permite generar sentencias SQL o importar datos en una base de datos. Para cálculos monetarios que exijan exactitud, conviene definir una estrategia de precisión: la ejecución SQL puede introducir efectos de coma flotante.
Unir archivos y cambiar de formato
Supongamos que clientes.csv contiene:
cliente,ciudad
"Librería Norte",Bilbao
"Café, Central",Madrid
"Estudio Sur",Sevilla
Podemos añadir la ciudad a cada venta:
csvjoin --left -c cliente ventas.csv clientes.csv > ventas_con_ciudad.csv
csvjoin combina tablas por una clave. --left conserva todas las filas del primer archivo, aunque no haya coincidencia en el segundo. Si una clave aparece varias veces en ambos archivos, la unión puede multiplicar las filas: comprueba que esa relación sea la que necesitas.
Para otras entradas y salidas:
in2csv ventas.xlsx > ventas_desde_excel.csv
csvjson ventas.csv > ventas.json
csvformat -D ';' ventas.csv > ventas_punto_y_coma.csv
in2csv convierte una hoja de Excel en datos tabulares; no preserva su presentación. csvjson produce JSON y csvformat permite cambiar el delimitador de salida. Fíjate en la diferencia: -d indica el separador de entrada y -D, en csvformat, el de salida.
Separadores, codificaciones y tipos
Para un archivo separado por punto y coma y codificado en Windows-1252:
csvlook -d ';' -e cp1252 -y 0 -I exportacion.csv
-y 0 desactiva la detección automática del dialecto. -I desactiva la inferencia de tipos en los comandos que la admiten, como csvlook, csvstat y csvsql. Resulta útil para conservar como texto identificadores como 00123. Los argumentos comunes documentan las opciones de codificación y formato; consulta también la ayuda del comando concreto.
No desactives la inferencia sin pensar en la siguiente operación: un precio tratado como texto puede ordenarse de forma distinta a un número. Y que un fichero se lea correctamente no demuestra que sus datos sean válidos; las reglas de negocio siguen necesitando comprobaciones propias.
Cuándo encaja en tu trabajo
csvkit resulta cómodo para explorar una exportación, preparar una carga o automatizar transformaciones pequeñas y repetibles. Puedes guardar los comandos en un script y revisar exactamente qué filtros aplicaste.
Cuando aumentan mucho el volumen o la complejidad, conviene evaluar un motor como DuckDB o una librería como Polars. Algunas operaciones de csvkit necesitan mantener datos en memoria y cada comando de una tubería puede volver a interpretarlos. Su principal atractivo es la comodidad: pasar de un CSV desconocido a una transformación comprensible con unas pocas instrucciones.
