¿Como importar multiples CSV con Load Data Local Infile?

Tengo varias dudas que consultarles y agradecería su ayuda..

He buscado mucho pero no he encontrado la solución ni tampoco en la documentación que indicaban en otras preguntas de LOAD DATA.

La cuestión es que tengo que importar cientos de miles de archivos CSV, e intento hacerlo con LOAD DATA LOCAL INFILE.

Los archivo los tengo en mi PC y lo hago en Navicat con bbdd localhost.

El código que estoy utilizando para importar 1 archivo y que funciona, es:

LOAD DATA LOW_PRIORITY LOCAL INFILE 'ruta_archivo/pepito_XXXX_datos.csv'

REPLACE INTO TABLE nombre_tabla

FIELDS TERMINATED BY ','

ENCLOSED BY '"'

LINES TERMINATED BY '\r\n'

IGNORE 4 LINES

(@fecha,campo1, campo2, campo3, etc)

SET fchFechaHora = str_to_date(@fecha, '%d/%m/%Y %H:%i'), campoX = 'XXXX';

Cuestiones:

1) Tengo varias carpetas con cientos de archivos CSV dentro de cada una. ¿Qué tendría que indicarle para que al hacer el LOAD DATA me subiera todos los archivos csv que se encuentren dentro de esa o esas carpetas? He probado el * pero no funciona.

2) ¿Se puede poner algo para que el propio nombre del archivo o una parte de él, lo incluya en un campo de la tabla? Es decir, tengo el archivo que se llama: pepito_XXXX_datos. Csv, y dentro está campo1, campo2, campo3, etc.. Con datos aaaa, bbbb, cccc, etc.

Cómo puedo poner XXXX (esa parte del nombre del archivo, y que cada CSV tiene uno distinto: pepito_YYYY_datos.csv' , pepito_ZZZZ_datos. Csv') ¿En un campo de la tabla? Crearía en la tabla un campoX para que me ponga ese XXXX en ese campo en cada línea que escriba en la tabla.. Quedando así:

CampoX fchFechaHora campo1 campo2 campo3

XXXX 20-12-2017 11:00 aaaa bbbb cccc

3) El archivo CSV, los datos comienzan en la fila 5, por lo que le indico que IGNORE 4 LINES. Peeeeero, en la primera fila, también hay un nombre que necesito, manolete, pero claro, al hacer el IGNORE.. Pasa del tema.

El archivo (pepito_XXXX_datos. Csv) sería como el anterior:

FILA 1 —> manolete

FILA 2 —>

FILA 3 —>

FILA 4 —> fecha, campo1, campo2, campo3

FILA 5 —> 20/12/2017 11:00 aaaa, bbbb, cccc

FILA 6 —> 20/12/2017 10:00 dddd, eeee, fffff

Y en la tabla final quiero que quede de la siguiente manera:

CampoX campo0 fchFechaHora campo1 campo2 campo3

XXXX manolete 20/12/2017 11:00 aaaa bbbb cccc

XXXX manolete 20/12/2017 10:00 dddd eeee fffff

4) Estos archivos suelen estar en todas esas carpetas que te digo, pero a veces el archivo no está, por lo que el QUERY se para dando error..

¿Hay alguna forma de decirle que si no existe el archivo, que continue con el resto de archivos y no se pare ahí?

5) Hay archivos a su vez, que no tienen los datos correctos, es decir, en lugar de tener las filas anteriores, tienen un HTML dentro, por lo que el CSV es:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es"><head>

...

</html>

En lugar de las FILAs anteriores que te decía en el punto 3.

Se distingue el archivo CSV también porque en lugar de ocupar 2 o 3 KB, ocupa unos 42 KB.

¿Hay alguna forma de decirle que si el archivo CSV empieza por "<!DOCTYPE…." no lo importe y pase al siguiente? ¿O alguna forma de decirle que si el archivo pesa más de 5 KB no lo importe con el LOAD DATA?

6) También hay veces que en el archivo CSV en el campo de fecha, en lugar de venir en formato dd/mm/yyyy h:m viene en formato yyyy/mm/dd h:m, pero no siempre, e incluso mezclados, unas filas empiezan dd/mm/… y otras yyyy/mm…

Cómo se puede hacer un condicional IF para indicarle que si viene en formato tal, haga esto:

SET fchFechaHora = str_to_date(@fecha, '%d/%m/%Y %H:%i')

Y si viene en el otro formato, también me lo convierta a esto, ya que en la bbdd estará, claro, en formato yyyy-mm-dd h:m:s

Ya sé que es muy larga la pregunta, pero con esto me solucionarían muchísimo trabajo..

Añade tu respuesta

Haz clic para o