csvkit – CSV, Excel y MySQL

Hace unas semanas, me tocó trabajar con un proyecto que constaba de migrar clientes que estaban en un archivo de Excel a una base de datos MySQL. Por ahí me encontré csvkit y me impresionó lo sencillo y rápido que es.

Las cosas hubieran sido más sencillas si nos hubieran dado las tablas de la base de datos, pero por lo que sea solo contábamos con esos archivos y era lo único que íbamos a tener. Así que lo mejor era comenzar a ver cuál era la manera más sencilla de lograrlo.

Además de eso, otro equipo iba a necesitar que los datos de Excel también estuvieran con el formato CSV, porque iban a procesar otra información.

Los pasos para lograrlo eran:

  1. Analizar los archivos para crear las tablas en MySQL
  2. Pasar los archivos de Excel (el primero con clientes y direcciones y el segundo con los países y estados) a CSV
  3. Preparar los archivos CSV para ser migrados a MySQL de acuerdo con la estructura del punto 1
  4. Usar un cliente como DBeaver para importar los archivos a las tablas

Como me gusta complicarme la vida, pero aprender cositas, busqué cómo pasar directo de Excel a MySQL (En Linux), sin éxito. Sin embargo, logré dar con una herramienta llamada csvkit, que básicamente es una suite de pequeñas utilerías que te ayuda a trabajar con Excel y CSV de manera sencilla. La puedes encontrar acá.

Con csvkit iba a poder:

  1. Convertir de Excel a CSV con un simple comando
  2. Obtener las columas necesarias y pasarla al archivo que sería migrado
  3. Migrar directo de CSV a MySQL, ¡sin crear las tablas previamente!

Cool, ¿no?

Vamos a ver cuál fue el proceso.

Instalar csvkit

pip install csvkit

Obviamente necesitas tener instalado Python.

in2csv

Este comando nos servirá para convertir una hoja de Excel al formato CSV.

in2csv --sheet SHEET_NAME input.xlsx > sheet-name.csv

csvcut

No ayudará a ver, filtrar y cortar un archivo CSV.

csvcut -n sheet-name.csv

La salida del comando nos servirá para identificar las columnas que necesitemos.

csvcut csvkit lista de columnas
csvcut csvkit lista de columnas

Podemos darle un poco de vista y seleccionar algunas columnas. Agregamos csvlook para ver más bonita la salida.

csvcut -c 1,2,3 output.csv | head -n 10 | csvlook
csvcut csvkit lista de columnas csvlook
csvcut csvkit lista de columnas csvlook

Como no necesitaremos todas las columnas, solo vamos a pasar ciertas columnas a un nuevo archivo CSV.

csvcut -c 1,5,10 sheet-name.csv > new-sheet.csv

Con esto ya tenemos el archivo que vamos a enviar a la base de datos.

csvsql

Este es el comando que hace la magia a la base de datos.

Entre otras cosas, con este puedes hacer consultas a un CSV, como si fuera, precisamente, SQL. En este ejemplo, lo usamos para insertar directamente el archivo new-sheet.csv a una base de datos creada previamente, ¡aunque sin haber creado las tablas!

Solo tenemos que construir la connection string.

csvsql --db mysql://root:[email protected]:3308/my_database --tables table_name --insert new-sheet.csv
  • --db: es la connection string.
  • --tables: es el nombre de la tabla que quieres.
  • --insert: es el archivo desde el que “copiará” la información y la insertará en la tabla.

Con esto deberías tener lista la base de datos y la tabla o tablas listas para crear los índices, primary keys y cualquier otra cosa que necesites en las tablas.

Estas herramientas tienen mucho potencial, así que recomiendo experimentar con ellas.

Problemas que surgen

En algunas ocaciones dará un error cuando quieras ejecutar este comando por error del driver. En mi caso, lo solucioné instalando mysql-client.

Otro error que puede dar es el del conector, pero se soluciona ejecutando el comando que te recomiendan en el error que muestra.

NOTA: en Mac fue sencillo todo el proceso. En Fedora me dio un dolor de cabeza porque csvsql no quería conectar, aún teniendo instalados los clientes de mysql y mariadb y el conector de Python no se instalaba. Al final lo resolví con entornos virtuales.

¡¡¡Saludos!!!


Posted

in

by