Importar archivos CSV en tablas SQL

Dado que mi experiencia con Firebird ha sido bastante decepcionante (ver post anterior), he tenido que buscar maneras de pasar los datos desde Firebird hasta MySQ. Aunque en el pasado ya había utilizado la importación desde archivos .SQL que contenían sentencias INSERT, el proceso completo puede ser bastante tedioso, porque hay tipos de campos no soportados entre Firebird y MySQL, lo que implica que tenía que editar manualmente, en muchas ocasiones, los .SQL exportados desde Firebird.

Dado que de todas las tablas sólo precisaba de cuatro, y que de esos datos sólo precisaba algunos campos, preferí ahorrar recursos y exportar únicamente los datos que fuera a necesitar.

Una vez conseguidos los .CSV, limpios de cualquier sentencia SQL, sólo tuve que crear tanto la nueva base de datos como las nuevas cuatro tablas.

Como ejemplo, paso a escrinbir el código para crear una de las tablas:

CREATE TABLE `diagnosticos` (
 `NHISTORIA` INT(10) NOT NULL,
 `NREVISION` INT(3) NOT NULL,
 `FECHAINI` DATE NOT NULL,
 `DIAGNOS` VARCHAR(6) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

La migración puede ser realizada de dos maneras diferentes, desde comandos Linux, o desde la propia consola de MySQL.

Línea de comando desde GNU/Linux

En Justin Kelly se explica bien qué pasos hemos de realizar:

mysqlimport --fields-terminated-by=,  --local -u usuario -p mis_datos mi_tabla.csv

En este comando todo es bastate autoexplicativo: qué separa las colimnas (en este caso, una coma), cómo se indica el usuario, la base de datos  (mis_datos) y la tabla de la misma. En esta orden, la tabla debe tener el mismo nombre que el fichero .CSV, en este caso, mi_tabla. En el caso de que el .CSV contenga una primera línea con el nombre de las columnas, hemos de indicar que no importe la primera línea: –ignore-lines=1.

Desde la consola de MySQL

Lo primero es abrir la consola de MySQL y acceder a ella:

mysql -u rafa -p pacientes
MariaDB [pacientes]>

Ahora que ya estamos en modo consola, las órdenes son muy parecidas (este tutorial y este lo explican muy bien):

LOAD DATA LOCAL INFILE 'DIAGNOSTICOS_2017.csv' 
INTO TABLE diagnosticos 
FIELDS TERMINATED BY ';' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS ;

De manera intencionada he indicado tanto la tabla (diagnosticos) como el archivo .CSV, señalando que ambos tienen nombres diferentes. De nuevo, el comando es bastante autoexplicativo.

También de manera intencionada he indicado en la creación de la tabla que uno de los campos es una fecha. ¿Cómo traducir un campo de un archivo .CSV a una fecha? La solución la encontré en StackOferflow, en la que se utilizaba un comando interno de MySQL:

STR_TO_DATE('2/15/2017 ','%m/%d/%Y')

Con esta línea, le estoy indicando a la consola que el formato 2/15/2017 es de mes-día-año. Cuando más tarde acceda a los datos, estarán almacenados en un fomato correcto de YYYY-MM-DD, dentro de la tabla. El comando final quedaría así:

LOAD DATA LOCAL INFILE 'DIAGNOSTICOS_2017.csv' 
INTO TABLE diagnosticos 
FIELDS TERMINATED BY ';' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(NHISTORIA,NREVISION,@FECHAINI,DIAGNOS) 
SET FECHA=STR_TO_DATE(@FECHAINI,'%d.%m.%Y');

El .CSV con el que estaba trabajando tenía un formato extraño de día.mes.año, de modo que tuve que indicar qué significaba cada cifra a cada lado del punto.

Con este último comando, he de decir que la migración pasó sin problemas (Phpmyadmin no sólo tardaba más, sino que tendía a bloquearse con frecuencia), en menos de un segundo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *