martes, 15 de enero de 2013

[Truco] Importar un archivo CSV en una tabla MySQL

Hoy necesitaba importar un volcado inmenso de datos en una tabla MySQL. El archivo origen estaba en formato CSV para Excel, que es algo diferente del CSV estándar. Nunca había realizado una carga de datos similar, pero una búsqueda en Google me ha revelado el comando LOAD DATA INFILE. Sólo he encontrado referencias al mismo en inglés, así que paso a contar como funciona.

El comando MySQL LOAD DATA INFILE permite leer registros desde un fichero de texto, pudiendo determinar las características de los datos a procesar como el carácter de separación (coma, punto y coma, etc.), el carácter de fin de línea (CR, CRLF, etc.) y algunas cosas más. El formato de este comando se puede encontrar en el manual de MySQL.


Ejemplo #1:

LOAD DATA
LOCAL INFILE 'C:\\location.csv'
INTO TABLE location
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

En este ejemplo se procesará el archivo "C:\location.csv", que se encuentra en el ordenador cliente (LOCAL), grabando los datos en la tabla "location", indicando que los campos están separados por punto y coma (CSV para Excel) y las líneas acaban con "CRLF" (Windows). Además se salta la línea de cabecera (IGNORE).


Ejemplo #2:

LOAD DATA
INFILE 'location.csv'
INTO TABLE location
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';

En este segundo ejemplo se procesará el archivo "location.csv", que se encuentra en el servidor, grabando los datos en la tabla "location", indicando que los campos están separados por coma y delimitados por comillas (CSV estándar) y las líneas acaban con "LF" (Linux).

16 comentarios:

  1. Excelente entrada, me sirvio mucho.

    Mil gracias

    ResponderEliminar
  2. AMIGO.. NO SABES EL TIEMPO QUE ME AHORRASTE CON 60000 PRODUCTOS QUE TENIA UNA EMPRESA PARA CARGAR... QUE DIOS BENDIGA SUS CONOCIMIENTOS

    ResponderEliminar
  3. Hola me ayudo mucho tu post, pero intento reemplazar los valores decimales como 0,113 de mi archivo por puntos para que mi tabla de mysql los pueda aceptar. como podría hacerlo

    ResponderEliminar
    Respuestas
    1. En el block de notas usando el comando Edicion/Reemplazar...

      Eliminar
  4. buenas noches, tengo una pregunta y si el delimitador fuera distinto a ; y , como seria el script sql por decir si el delimitador fuera ¤.

    muy bueno el articulo....

    ResponderEliminar
  5. hola, muchas gracias por la informacion, tengo una pregunta por si alguien tiene o tuvo un caso similar, tengo una aplicacion web desde la que se carga un archivo .csv y actualiza la base de datos, al cargar el archivo muestra un mensaje que el archivo fue cargado con exito pero al revisar la BD, no se actualizó la informacion antes cargada.

    ResponderEliminar
  6. alguien que me pueda ayudar estoy intentando tomar un archivo csv y insertarlo por php toda funciona pero tengo un campo fecha en csv 26-01-2016 pero no me lo inserta en la tabla de mysql de ante mano muchas gracias

    ResponderEliminar
  7. HOLA QUE TAL, LO INTENTE HACER PERO ME MARCA EL ERROR 1290, CÓMO PUEDO SOLUCIONARLO?

    ResponderEliminar
  8. HOLA QUE TAL, LO INTENTE HACER PERO ME SALE EL ERROR 1290, CÓMO PUEDO SOLUCIONARLO?

    ResponderEliminar
  9. Funciona excelente, Gracias amigo.

    ResponderEliminar
  10. Hola, no se si todavía respondes preguntas?, tengo una duda, tengo un archivo .csv con bastante datos pero hay campos que no tienen datos los mismos son campos con claves foraneas, y no se como hacer para configurar el archivo para que al momento de importar el archivo tome esos campos como nulos. Hice una prueba desde la BD y exporte el archivo como CSV, (los campos que no le habia ingresado datos figuraba NULL), pero cuando lo quise volver a importar me toma error que ya que en los campos nulos me ingreso \t. Y no se como configurarlo para que me tome valores nulos en el archivo .csv. Agradezco toda orientación posible

    ResponderEliminar
  11. Martin Balog ya resolviste tu problema?

    ResponderEliminar