Cargar datos en mySQL con LOAD DATA INFILE

Mucha gente me ha preguntado esto y bueno, decidí hacer un post para quienes buscan esta instrucción, para que aprendan a usarla.

LOAD DATA sirve para tomar cualquier archivo «comma-separated» (separado por comas, aunque no necesariamente son comas) y cargarlo como datos en alguna tabla de mySQL; la sintaxis básica es:

LOAD DATA LOCAL INFILE '/importfile.csv'
INTO TABLE test_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(field1, filed2, field3);

Adicionalmente tiene algunas opciones; pero expliquemos con detalle el comando:

LOAD DATA indica que debe cargar un archivo csv (cualquier hoja de cálculo puede generar este tipo de archivos); si pasamos la opción LOCAL indicamos que el archivo esta en nuestra máquina y que debe ser leído por el cliente y enviado al servidor; sino, la ruta (absoluta o relativa) es en el servidor.

Si dentro de la tabla hay registros, la violación de primary keys podría causar la detención de la carga, entonces escribimos las opciones IGNORE (ignora las filas que violen el constraint y no las inserta) o REPLACE (agrega las filas reemplazando las existentes).

Fijense que quedaria algo como:

LOAD DATA LOCAL INFILE ‘ruta_archivo’
REPLACE INTO TABLE ‘nombre de la tabla’

Si acaso el archivo está en una máquina windows guardado en ISO-8859-1, entonces pueden pasar opcionalmente el charset en el que está el archivo en la sentencia:

CHARACTER SET latin1

Las opciones de como está estructurado el campo:

La dirección que está en mi hoja de calculo tiene comillas simples y comas en los datos, como separo entonces?.

Puedes inventarte cualquier separador entre campos: campo1 : campo2 : campo3 : … campoN : (separados con 2 puntos), simplemente debes indicarle a mySQL cual es el separador de campos con:

FIELDS TERMINATED BY ‘;’ <- yo por lo general uso punto y coma en vez de coma, a veces, uso el PIPE -> |

Tambien pueden indicar con QUE están encerradas las cadenas, si comillas simples, dobles, numerales (#), acentos viriguardilla (~) y cualquier cosa que se les ocurra: «campo1»; «campo2»; «campo3»; …

FIELDS ENCLOSED BY ‘»‘ <- fijense que dentro de las comillas simples, estan unas dobles.

Pueden agregar OPTIONALLY para indicar que algunos campos estan encerrados con comillas, pero no todos:

FIELDS OPTIONALLY ENCLOSED BY ‘#’

Inicio y fin de linea:

Como se inicia la linea?, cadena vacia?, vienen con una columna serial que queremos ignorar?, algun caracter?, simplemente escribimos:

Interpret occurrences of tab, newline, or â??\â?? preceded by â??\â?? as literal characters that are part of field values.

LINES STARTING BY » <- indica que las lineas empiezan en una cadena vacia

LINES TERMINATED BY ‘\n’ indica que  la lina termina con un salto de linea (\n).

Si en su archivo csv hay una o mas filas que repreentan los encabezados de los campos y desean «obviarlas» entonces:

IGNORE 1 LINES hará que se ignore una linea.

Procesamiento de los campos:

En algún sitio debo indicar que representan las columnas de mi archivo coma-separado; las columnas de dicho archivo son leidas secuencialmente, asi que la primera columna del archivo, por defecto, se guardará en la primera columna de mi tabla, si queremos sobre-escribir este comportamiento ejecutamos:

(campo1, campo2, campo3, campo4, campo5 …

para indicar su orden de guardado en la tabla; ejemplo, tenemos una tabla:

nombre, apellido, cedula, fecha_nacimiento

pero en el csv los campos vienen cedula, nombre, apellido, fecha_nacimiento, entonces colocamos entre parentesis los campos asi:

(cedula, nombre, apellido, fecha_nacimiento)

Primera columna de mi csv corresponde al campo cedula, segunda al nombre y asi suscesivamente.

Formateo y condicional de datos:

Si acaso la fecha de nacimiento la guardan el el común formato de las hojas de excel (23/10/78), podemos entonces «guardar» en una variable temporal el valor del campo fecha de nacimiento y procesarla despues, ejemplo:

(cedula, nombre, apellido, @fecha) <- crea una variable temporal de fecha

SET fecha_nacimiento = str_to_date(@fecha, ‘%d/%m/%y’) <- toma la variable @fecha (que tiene la forma dia/mes/año de 2 digitos) y la convierte a ANSI (año de cuatro digitos-mes-dia).

un caso común ocurre con que la gente en JOSS PRO (notese el acento en la X) que escribia todo como si estuvieran trabajando en 8 bits y los nombres vienen con JESUS LARA, PERICO DE LOS PALOTES, cuando deberían ser naturalmente capitalizados; eso se acomoda:

(cedula, @nombre, @apellido, @fecha)

SET nombre =  CONCAT(UCASE(LEFT(@nombre, 1)), SUBSTRING(LCASE(@nombre), 2))

Asi que queda como chuleta si quieren convertir sus viejas aplicaciones FOJJ PRO a nuevas RBDMS como mySQL.

Como final, la sintaxis completa queda:

LOAD DATA LOCAL INFILE ‘archivo’
IGNORE
FIELDS TERMINATED BY ‘;’ ENCLOSED BY ‘»‘
LINES STARTING BY » TERMINATES BY »
IGNORE 1 LINES
(field1, field2, field3, @field4)
SET field4 = (alguna cosa SQL que quieran hacerle a @field4)

90 comentarios sobre “Cargar datos en mySQL con LOAD DATA INFILE

  1. Quisiera saver si se puede guardar en un archivo txt, desde la creacion de la base de datos como de las tablas hasta la insercion de los datos, y poder ejecutar desde la consola de mysql, utlizando las lineas de comando LOAD DATA LOCAL INFILE…

    Tambien quisiera saver si ya no existen mas versiones del mysqlAdmin y el pork?¿?¿

    muchas gracias.

  2. hola intente por todas las formas el de crear toda una base de datos y sus tablas mas la informacion que cada tabla deve tener y no pude agradeceria m,ucho si alguien podria ayudarme…

    mi nick es PSL FoX muchas gracias

  3. Tu lo que deseas hacer es un «dump» de la base de datos; es crear un archivo (extension .sql, al final es un archivo de texto) con todas las directivas de creacion de la base de datos, sus tablas, indices y la data exportada en la forma de INSERT INTO respectivos; efectivamente eso se puede hacer con:
    1.- el comando mysqldump
    2.- usando mysql administrator (una aplicacion grafica, por si no te mola un comando en consola como mysqldump).
    3.- phpmyadmin (una aplicacion via web).

    Claro que existe, debes instalar:
    fedora:red-hat:
    yum install mysql-admin mysql-admin-common
    debian:
    aptitude install mysql-admin
    gentoo:
    emerge mysql-administrator

  4. Hola!, muy bueno el tema, pero tengo una pregunta:

    tengo una tabla en mysql asi:

    Identificacion Nombre Apellido Telefono . . . . . . . .

    Y tengo un archivo txt con los campos separados por tabuladores y las lineas terminadas en salto de linea ‘\n’ asi:

    Codigo1 Identificacion Nombre Apellido Telefono . . . . . . . . . . .

    necesito cargar los datos de este archivo a mi tabla, pero como ves, hay un campo de más en el archivo (Codigo1).

    Finamente mi pregunta es:

    ¿Puedo cargar el archivo a mi tabla en mysql ignorando la primera o cualquier otra columna?

    Muchas Gracias.

  5. Si deseas obviar la primera columna, simplemente recuerda que puedes usar SET al final para asignar columnas (en el orden como vienen en el archivo) si usando SET obvias a Codigo1 evidentemente no se tomarà en cuenta; esta es la situación:
    (@codigo1, nombre, apellido, telefono, cedula, @fecha_inicio … … …)
    Donde cada uno representa el orden de las columnas del archivo y los nombres representan a QUE CAMPO de la tabla se va esa columna en particular; fijate que a codigo1 lo asigné a una variable (@codigo1), si no hago nada con esa columna entonces simplemente se pierde y queda obviada.
    adicionalmente fijate que si tu archivo de texto tiene fechas 23/10/78 entonces puedes asignar la columna fechas a @fecha_inicio y luego usando SET ejecutas:
    set fecha_inicio = str_to_date(@fecha_inicio, ‘%d/%m/%y’)
    Espero te sirva la recomendación …

  6. Buen dia. Priemro una felicitacion por dedicar este tema, y quisiera preguantar si se puede hacer lo contrario,es decir guardar na de mysql en un archivo plano (txt). De natemano agradeceria sus comentarios

  7. podrian decirme como hacer que el archivo .txt con los datos nombre edad sexo direccion separados por el tabulador lo mande a una tabla de mysql las lineas que debo ocupar y como indicar la ruta del archivo o donde debe estar

  8. si el archivo tiene esas columnas en ese orden, separado por tabuladores; usas el comando LOAD DATA LOCAL INFILE ‘ruta del txt, completa!’ … cuando digo completa es que debe incluir las rutas absolutas para llegar al archivo (y evidente el usuario que hace la carga debe tener privilegios para leer el archivo).
    Si el archivo tiene encabezados usas IGNORE 1 LINES.
    y usas FIELDS TERMINATED BY ‘caracter de separacion entre campos’; las tabulaciones tienen una forma de escapado (creo que es \d) sin embargo no recuerdo (y estoy contestando esto offline en una carretera).
    Si tienes algun problema construyendo la sentencia LOAD DATA me avisas …

  9. Un saludo cordial, agradesco desde ya la ayudada que me puedan ofreser, mi caso es similar al anterior tengo un txt con datos separados por tabuladores, podrias poner un ejemplo de como colocar los datos me refiero a la estructura y si hay algun cambo vacio que debo colocar para q guarde como tal. estoy usando esto pero no resulta:

    A0611 INAP \N \N \N \N \N \N
    A0612 N. \N \N \N Abbagnano \N \N
    A0613 José B. \N \N \N Adolph \N \N
    A0614 Luis Felipe \N \N \N Alarco \N \N

    le doy \N a los campos vacios

  10. La pregunta es la siguiente tengo una tabla con un campo autoincrementable y un archivo txt separados por el simbolo mayor que (>) que me contiene el resto de los campos que necesito para la tabla, lo he tratado de hacer poniendole al final los campos que representan en la base de datos pero me da un error «You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘/COO,MontoTotal)’ at line 1» me gustaria si se puede me ayudaras con la construcción de la sentencia sql. Ah y estoy trabajando en php.

  11. deseo cargar una tabla mysql desde un archivo de texto, en el hay columnas de tipo de dato datetime, el problema es que en el archivo de texto algunos registros en esa columna estan vacios, a la hora de ejecutar la sentencia aparece lo siguiente:

    Incorrect datetime value: «» for column «nombre del campo datetime»

    Alguien me podría ayudar por favor!

  12. Quiero saber si es posible solamente cargar el archivo cumpliendo una condicion especifica, por ejemplo en una tabla donde tengo:

    tienda,articulo

    Necesito subir solo los articulos donde la tienda sea la numero 92 ya que en mi archivo tengo los registros de 2 tiendas(41 y 92)…se podrá utilizando la rapidez y velocidad del LOAD DATA INFILE?

  13. Quiero saber si es posible solamente cargar el archivo cumpliendo una condicion especifica uno de los campos del archivo, por ejemplo en una tabla donde tengo:

    tienda,articulo

    Necesito subir solo los articulos donde la tienda sea la numero 92 ya que en mi archivo tengo los registros de 2 tiendas(41 y 92)…se podrá utilizando la rapidez y velocidad del LOAD DATA INFILE?

  14. José Espinosa; te aconsejo que pruebes con IF (deberia funcionar, aunque no lo he probado); la cosa iría más o menos de la siguiente manera:
    campo, campo, campo, @fecha <- el que tu quieres, pasalo a una variable Como tienes valores vacios, el campo DEBERIA aceptar valores zero, sino, al menos ponle un valor "by default" como un CURRENT_TIMESTAMP. En tu caso; lo harás de la siguiente manera: SET fecha_datetime = IF(@fecha='',CURRENT_TIMESTAMP,str_to_date(@fecha, ‘%d/%m/%y’)) Esa estructura es técnicamente válida; puedes en vez de pasar un current_timestamp; pasar un '0000-00-00 00:00' si el campo acepta zerofill.

  15. Jonás, no he testeado logica IF en un LOAD DATA INFILE; posiblemente (por el backend de la DB y por tener indices y otras cosas); sea más eficiente el siguiente movimiento de:
    1.- creas una tabla temporal en memoria, tipo MEMORY (HEAP) (ej. temp_articulos)
    2.- agregas indices para el campo tienda a la tabla en memoria (temporal) eso mejorará la consulta que realizaremos en paso 4.
    NOTA: si quieres la dejas creada al arranque de tu app y no tienes que hacer el paso DROP (pero si el TRUNCATE)
    3.- haces el LOAD DATA INFILE de TODOS los registros
    4.- ejecutas la insercion de todas las tiendas 92 en la tabla final:
    INSERT INTO articulos (tienda, articulo)
    SELECT * FROM temp_articulos WHERE tienda = 92 (<- Subconsulta de insercion) 5.- despues de transferidos los datos a la tabla; vacias la tabla con: TRUNCATE temp_articulos o en su defecto la borras: DROP TABLE temp_articulos.

  16. Quiero hacer la carga de una tabla pero esta tiene columnas que son enteros, pero con LOAD DATA INFILE me da un error he pensado que no es posible cargar un entero, pero por la experiencia tuya creo es posible. Espero que me ayudes, gracias espero que me puedas ayudar.

  17. Quiero hacer la carga de un archivo txt donde exiten campos que deben ser enteros en la tabla a la que se le va a pasar, los campos estan separados por ‘>’ pero con LOAD DATA INFILE me da un error he pensado que no es posible cargar un entero, pero por la experiencia tuya creo es posible. Espero que me ayudes, gracias espero que me puedas ayudar.

  18. Douglas, ¿qué error te da?; la cosa debe estar sucediendo con el tipo de separador de cadenas que debes estar usando; no existe motivo para que un entero no sea cargado; pon una fila de ejemplo como comentario y la sentencia LOAD DATA que estas usando …
    Todos los campos están separados por ‘<'? ... Si consideras que está bien la lógica de tu LOAD DATA entonces juega a colocar en una variable @columna a cada columna que es entera; posteriomente ejecuta: SET columna_entero = CAST(@columna as UNSIGNED) (o SIGNED si es entero con signo negativo) Eso debería hacer la conversión a entero, si encuentra un valor null o vacio, lo convierte a cero, si acaso son decimales, entonces usas CAST(@columna as DECIMAL). Prueba a ver y me avisas con exactitud el error que te da ...

  19. Gracias por la pronta respuesta, ya fue solucionado el problema pero de veras que estoy agradecido de que se preocupen de responder las inquetiudes de algunos de nosotros que podamos tener una duda por muy pequeña que esta sea.

    El problema que se presentaba era por un valor que queria meter en la base de datos MySQL ya que tenia un campo que era float y estaba tratando de mandar el valor con coma por ejemplo (15,56) y no lo podia recibir de esa manera sino de esta forma (15.56) y no tuve que agregar nada mas y funciono de muy buena manera.

    Esta fue la instrucción que utilice:
    LOAD DATA INFILE ‘PruebaDG.txt’ INTO TABLE prueba FIELDS TERMINATED BY ‘>’ OPTIONALLY ENCLOSED BY » LINES TERMINATED BY ‘\r\n’;

    Este es el archivo con el cual realice la prueba:
    123456>154289.25>Douglas>Gene
    789456>1200.05>Daniel>Perez
    456789>1150.30>Jose>Ruiz

    Y todo funciono de maravillas, Muchas Gracias por la ayuda phenobarbital.

  20. Quiero hacer la carga de un archivo txt donde los campos no estan separados (pero si conozco la longitud de cada campo en el string) he usado LOAD DATA INFILE y me da error creo que lo interpreta como un solo campo. segunda pregunta el LOAD DATA crea la tabla o hay que crearla y depues llenarla, Espero no les moleste mi ignorancia estoy empezando, gracias espero que me puedas ayudar.

  21. Hola a todos tengo la siguiente inquietud ..

    He creado una base de datos la cual cargo cada hora con un archivo de texto mediante el comando:
    LOAD DATA LOCAL INFILE «TAS02000_status.txt» IGNORE INTO TABLE TblStatus FIELDS TERMINATED BY ‘ ‘;

    El Archivo TAS02000_status.txt contiene las siguientes columnas:
    733560.1250000000 2008-06-01 03:29:50 2008-06-01 03:00:00 TAB01441 1.9994 -78.8403
    733560.2083333334 2008-06-01 05:29:07 2008-06-01 05:00:00 TAB01441 1.9994 -78.8408
    ……
    he creado un script para que se cargue cada hora esta tabla, la cual agrega datos cada hora.

    Lo que esta pasando es que cada vez que la cargo se repiten los valores de las filas debajo de las que ya estaban almacenadas en la base de datos, por lo cual pienso que el comando IGNORE no esta funcionando como debe, ya que no IGNORA las que ya estan , si no que las repite creando nuevas filas.

    Cual seria la solucion para solo añada los nuevos datos de la tabla?

    Gracias

  22. Pregunta básica Efraín; quien es el PK (Primary Key) de la tabla TblStatus?, IGNORE asume que existe un principio de unicidad de los campos y por tanto,si la unicidad se cumple, el campo no se inserta; pero si por ejemplo el primer campo es el id y este es auto-increment nunca tendrás un criterio UNIQUE que pueda ejecutar el criterio IGNORE, revisa bien.
    Si deseas, postea aquí en DESCRIBE de la tabla para que veamos, ejecuta:
    DESCRIBE TblStatus;
    y lo colocas aquí
    Espero tu respuesta.

  23. perdona la demora en contestar …. mi trabajo no me permite mucho tiempo, pero efectivamente me faltaba establecer la PK … asi que ya esta llisto … muchas gracias por tu orientacion

  24. Hola Phenobarbital y felicitaciones por la página…
    Pfavor, te agradecería me ayudes con este problema:
    Quiero actualizar diariamente solamente el campo SALDO de una tabla que tiene los siguientes campos: CODF, APELLIDOS, NOMBRES, SALDO. En esta estructura el campo indice del tipo UNIQUE es: CODF
    Mi archivo txt ha sido generado con líneas de este tipo: «400»,»PEREZ»,»JUAN CARLOS»,»1000″
    Utilizo las siguientes líneas en mi código PHP:

    $var = «LOAD DATA LOCAL INFILE ‘C:/TEMP/usuarios.txt’ REPLACE INTO TABLE `usuarios` FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘\»\’ ESCAPED BY ‘\\’ LINES TERMINATED BY ‘\r\n'(`codf` ,@dummy , @dummy , `saldo`)»;
    mysql_query($var,$link) or die(«Error $var MySQL dice: «.mysql_error());

    El problema es que el sistema me da el siguiente error:
    Error LOAD DATA LOCAL INFILE ‘C:/TEMP/usuarios.txt’ REPLACE INTO TABLE `usuarios` FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘»\’ ESCAPED BY ‘\’ LINES TERMINATED BY ‘ ‘(`codf` ,@dummy , @dummy , `saldo`)
    MySQL dice: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘\’ LINES TERMINATED BY ‘ ‘(`codf` ,@dummy , @dummy , `saldo`)’ at line 1

    Utilizo las variables @dummy para obviar los campos que no necesito actualizar, pero no funciona y no entiendo a que se debe. He hecho varios intentos pero nada.
    Te estaré muy agradecido por la ayuda!!!

  25. tengo esta sintaxis para pasar csv a mysql,LOAD DATA INFILE ‘C:\\Users\\Abrahan\\Desktop\\RE-CSV-02.csv’ INTO TABLE table1 FIELDS TERMINATED BY ‘;’

    tengo una tabla con 5 campos y quisiera agregarle un campo mas con un valor fijo un codigo con exactitud.

    por ejemplo cedula, nombre, apellido,diercción,telefono, pero quisiera amedida que se cargue en mi base de datos se agregue un datos extra en otro campo (codigo 00012)

  26. Hola:
    Una consulta, ya que no he encontrado respuesta en google..
    YO quiero hacer algo asi:

    SET @fecha = ‘20080905’;

    LOAD DATA INFILE ‘/opt/lampp/htdocs/mis_test/data/ida_@fecha.txt’
    INTO TABLE ida3
    FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘»‘ LINES TERMINATED BY ‘\r\n’;

    Iniciar una variable y esa variable que este dentro del INFILE (@fecha).

    Sé que no se peude usar LOAD DATA en un procedimiento almacenado, entonces quisiera usarlo aparte, pero ahora me he topado con esto y no sé como lidiarno.

    Gracias de antemano.

  27. Buenas tardes yo tengo una pregunta,

    En este momento solo estoy cargando un .csv

    load data
    infile ‘/home/mas/muchos/masivos/ejemplo.csv’
    into table men_ldap
    fields terminated by «;»
    ( NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, TIPO_DOCUMENTO, NRO_DOCUMENTO)

    Como hago para cargar mas de 2 csv de forma masiva,

    muachas gracias,

  28. buenas noches amigo,
    tengo una consulta espero m puedas ayudar. Mi situacion es que tengo un hosting y uso este codigo para intentar subir mis archivos .txt:

    $var = «LOAD DATA INFILE ‘$sql_file’ INTO TABLE tabdtt FIELDS TERMINATED BY ‘;’ ENCLOSED BY ‘_’ LINES TERMINATED BY ‘\r\n’ «;

    el error que me aparece es el siguiente:

    Error LOAD DATA INFILE ‘C:\TabDtt.TXT’ INTO TABLE tabdtt FIELDS TERMINATED BY ‘;’ ENCLOSED BY ‘_’ LINES TERMINATED BY ‘ ‘
    MySQL dice: Access denied for user ‘courrier’@’%’ (using password: YES)

    Espero m puedas ayudar. Gracias.

  29. Tu problema no es la sentencia; es el acceso; el usuario con el que iniciaste la conexión (courrier) no tiene privilegios para acceder desde donde estás; posiblemente estás pasando mal el password; verifica la posibilidad de GRANT del usuario; ejemplo vuelve a ejecutarla con:
    GRANT ALL PRIVILEGES ON database.* TO courrier@’%’ IDENTIFIED BY ‘el password’;
    Donde database es el nombre de la base de datos a los que el usuario tiene acceso (* para todo) y @ip es la IP desde donde tendrá acceso (localhost para conexiones locales via socket, 127.0.0.1 para conexiones locales via TCP/IP, % como comodin para indicar «todas las IP»).
    luego de ello, vuelve a conectarte y ejecuta.

  30. Hola! quisiera una sugerencia para lo siguiente. Estoy cargando una tabla en específico con un archivo txt, pero la cuestión es que cada vez que se cargue ese archivo, la tabla se sobreescriba. Como hago para sobreescribir una tabla???? Agradezco la ayuda! 🙂

  31. Hola Mary; es bastante sencillo, si los registros en el txt son unicos (el PK permite que las entradas desde el txt sobreescriban registros existentes) entonces luego de la sentencia LOAD DATA INFILE ‘archivo’; en vez de usar la opción IGNORE usas la opción REPLACE y todo archivo que intente ser re-escrito será reemplazado con los que llegan desde el archivo.

  32. ey mira un detalle el archivo que estoy tomando no tienen separadores… en ese caso estoy tomando los datos y los estoy guardando en un arreglo de ahi lo estoy guardando en la tabla… Creo que no me serviría el LOAD DATA INFILE.. sera?.. 😦

  33. Estimados:

    Tengo un archivo txt, generado por un programa en DOS en formato Ascii y cuando ejecuto el LOAD DATA, me ejecuta bien, salvo por los nombres, no respeta la Ñ, acentos, ª, º, etc. o sea todos los caracteresespeciales…. he probado incluyendole la opcion CHARACTER SET … pero no se la opción indicada…..

    Y por último que sería lo acosejable para dejar este LOAD en una «rutina» o «tarea» que se ejecutará a cierto tiempo automáticamente.

    Gracias por la ayuda…

    Ruben

  34. Mary: si tomas los datos y los guardas en un arreglo, pues puedes vaciar directamente ese arreglo con el lenguaje de programación con el que estés trabajando; si los datos están en un archivo y deseas tomarlos usando LOAD DATA INFILE deberás entender que usar el espacio como separador hace que los datos en los campos no pueden tener espacios.

    Ruben:
    La opción para respetar un texto ASCII usando un character set es latin1 (ISO-8859-1); pruebala y me cuentas.
    Con respecto a dejarlo en una rutina o tarea; pues puedes hacer un script en tu lenguaje favorito (perl, python, php) que puedas ejecutarlo en modo consola y colocarlo en un cron; otra forma «MYSQL Pura» es que si usas mySQL 5.1 puedes declarar un evento MySQL (http://dev.mysql.com/tech-resources/articles/event-feature.html) aprovechando los EVENT schedulers.

  35. Hola estamos con mis compañeros cargando una base de datos Mysql y no podemos ingresar palabras que contengan
    ‘ñ’ y caracteres especiales como ¡ ? ¿
    Cuando encuentra uno de estos caracteres se corta la palabra a medias. Alguien puede ayudarno?

  36. Claro; debes tomar el cuenta el origen del archivo que contiene esas frases con carácteres especiales; si el archivo es creado en un sistema como Windows (usando un encoding ASCII basado en iso-8859-1) la sola apertura del sistema en Linux dará problemas (y ni hablar de intentar hacerlo con el cliente mysqlclient); ahora bien, podés contar con varias opciones:
    usar SET NAMES:
    Puedes usar SET NAMES=’latin1′ + la opcion CHARACTER SET = ‘latin1’ para forzar la carga del archivo usando LATIN1 (iso-8859-1) y obviamente cargarlos en una tabla

    Segundo:
    Puedes tener otra opción y abrir el archivo en modo UTF-8 con alguna aplicación y pasarlo por un «conversor» como iconv

    Si por ejemplo, siempre tendrás archivos llegando desde múltiples origenes y los estarás cargando con LOAD DATA INFILE es recomendable entonces que las tablas (o las tablas temporales) estén en LATIN1 y hagas la conversión a UTF-8 (que es casi nativa) usando:
    >set character_set_database=utf8
    y luego
    >INSERT INTO tabla_utf8 SELECT * FROM tabla_latin1
    Eso deberia copiar la data de la tabla temporal en latin1 a la tabla utf8 asumiendo que toda salida (en este caso) entrada a las tablas es utf8.

    Recuerda que SET NAMES ‘UTF8′ es un modo de decirle al servidor mysql «mira, todo lo que te voy a enviar está ya codificado en UTF8 y lo quiero recibir en UTF8»

    La tercerca forma (no comentada) es que si estás cargando archivos como por ejemplo XML; desde un script en algún lenguaje (ejemplo PHP) cargues el archivo utilizando DOM asumiendo la conversión automática de caracteres.

    Recuerda algo: nunca la DB guarda en un character especifico, como toda DB, es agnóstica al character set; pero, si defines un character set BY DEFAULT para las consultas y el ingreso de datos; esto lo haces con SET NAMES=’character set’; los más comunes son utf8 y latin1.

  37. hola tengo una pregunta estoy jalando los datos alamacenados en un archivo de texto a una base de datos de mysql 5.0 pero me marca un error al querer ignorar la
    primera linea del archivo de texto ya que es un encabezado mi sintaxis es esta:

    LOAD DATA INFILE «\int.txt» INTO TABLE pru
    FIELDS TERMINATED BY «\t»
    LINES TERMINATED BY «\r\n»
    IGNORE 1 LINES //En esta parte me marca error por que si le quito esta linea me ejecuta bien
    (Fecha,Tiempo,Temperatura,GraFara,GraFag,Temp,GradCent,GraCend,RH);

    entonces mi pregunta es como le hago para que me funcione correctamente mi sintaxis ya que necesito ignorar la primera linea del encabezado

    espero me puedan ayudar muchas gracias……

  38. Hola Pelon; para un script SQL (de mySQL obviamente) que deseas cargar desde la consola tienes dos opciones:
    Primera; comando mysqlrestore: te permite cargar un archivo SQL pasando obviamente opciones importantes como charset, base de datos a cargar, etc

    mysqlrestore -u root -p –database midatabase archivo.sql –default-charset=utf8

    segunda forma: usando el mismo comando consola de mySQL; para ello «volcamos» el archivo SQL en la consola de la siguiente manera:

    mysql -u root -p –database midatabase > archivo.sql

  39. Hola Susana; pues no debería darte error; ya que si vemos la sintaxis del comando LOAD DATA INFILE:
    http://dev.mysql.com/doc/refman/5.1/en/load-data.html
    Estas escribiendo correctamente el IGNORE 1 LINES; lo que estás (y me parece extraño que suceda) es usando comillas dobles para los argumentos; cuando deberían ser simples o traspuestas:
    ej.
    FIELDS TERMINATED BY ‘\t’
    o
    FIELDS TERMINATED BY ´\t´
    pero no:
    LINES TERMINATED BY “\r\n”
    Le estás indicando al SQL_MODE que use comilla doble como separador?
    Lo otro que sería interesante es que postearas el código de error para saber «exactamente» que error te está reportando la presencia de la linea IGNORE 1 LINES

  40. Hola disculpa la molestia, pero no entiendo como ignorar una columna, es decir si tengo algo como 1,Juan,M,20 en el txt y no deseo escribir M xq mi tabla tiene: cod,Nombre,edad -. Como identifico toda esta columna para que sea ignorada en todo el proceso, en alguna de tus respuestas dices que se puede usando SET, pero como? Debo anteponer @al campo del primer registro q sera leido?
    Agradesco mucho ty respuesta y sobre todo tu paciencia

  41. hola que tal,mi problema es el error es el siguiente «The used command is not allowed with this MySQL version», quería saber que puedo hacer para que ande

    $sql =»load data local infile ‘C:\ActualizaWeb\CLIENTES.TXT’ into table `clientes`»;
    mysql_query($sql,$conexion) or die(«Error $sql MySQL dice: «.mysql_error());

    # Versión del servidor: 5.0.45-community
    # Versión del protocolo: 10
    # Servidor: Localhost via UNIX socket
    la variable local-infile se encuentra en on

    Desde ya muchas Gracias

  42. Deseo hacer la carga de un archivo plano a una tabla desde un procedimiento, al usar la sentencia LOAD DATA INFILE, me aparece un error que me indica que la sentencia no es permitida dentro de un stored procedure ¿cómo puedo hacer esta carga dentro de un procedimiento almacenado? Gracias.

  43. Deseo hacer la carga de un archivo plano a una tabla desde un procedimiento, al usar la sentencia LOAD DATA INFILE, me aparece un error que me indica que la sentencia no es permitida dentro de un stored procedure ¿cómo puedo hacer esta carga dentro de un procedimiento almacenado? Y además que lo ejecute un cron job. Todo esto está en phpAdmin

  44. Hola..!! Debo hacer una carga de un archivo plano a una tabla desde un procedimiento, al usar la sentencia LOAD DATA INFILE, me aparece un error que me indica que la sentencia no es permitida dentro de un stored procedure ¿cómo puedo hacer esta carga dentro de un procedimiento almacenado o quizás algo parecido? y además ejecutar este sp mediante un cron job. Gracias.

  45. hola phenobarbital, una pregunta, estoy capturando el archivo csv desde un input file y recojo el mismo en una variable de php, el mismo lo paso como parametro a la funcion de una clase para insertarlo en la bd, me parece que donde estoy fallando es en las rutas absolutas, en el query estoy haciendo uso del LOCAL y aun asi me sigue fallando insertar los campos a la tabla, probando directamente desde la consola del servidor y teniendo el archivo local en el servidor funciona pero desde la maquina cliente como necesito hacerlo me falla, alguna sugerencia?

  46. Hola Hugo . . .. . a mí me estápasando exactamente igual. . . traigo mi ruta en una variable y la paso a la función que hace la inserción en la BD . . . pero no puedo hacer que me grabe en la tabla . . . si yo lo intento desde la máquina servidor no hay ningún problema pero si yo entro a la aplicación desde otro equipo, no me inserta nada.

    ¿Pudiste resolver tu problema? . . . ya que me ayudaría mucho . .

  47. Saludos amigo, es muy interesante el tema,, pero tengo una pregunta… tengo que hacer la migracion de este archivo http://mlearn.ics.uci.edu/databases/function-finding/function-finding.data a mi base de datos my sql…
    en donde ya tengo creada my tabla asi:
    datos
    dcaso varchar(10)
    dx varchar(10)
    dy varchar(10)
    dfuente varchar(10)
    dformula varchar(10)
    dcomentarios varchar(10)

    el problema con el que me encuentro es que si te fijas en el archivo que esta en el link los datos tanto de X como de Y se encuentran en columnas… asi

    x y
    1.0 29.750
    1.5 19.125
    2.0 14.375
    3.0 9.500
    4.0 7.125
    5.0 5.625
    6.0 4.875

    no se como especificarle cuales son los puntos de x, y cuales son los puntos de y.

    EL TRABAJO CONSISTE EN NO MODIFICAR EL ARCHIVO, la migracion se debe hacer tal cual se encuentra el archivo.

    lo que si puedo modificar es la tabla…

    Espero me puedan ayudar.
    De antemano Gracias

  48. hola espero y puedan ayudarme,

    mi problema es que desde un archivo .php necesito mandar el contenido de un archivo.txt a mi base de datos creada en mysql. hasta ahorita tengo esto de codigo pero no me muestra ningun resultado en la base de datos .
    Espero puedan ayudarme

  49. Gran tema, que ahorra mucho trabajo pero también dá muchos quebraderos de cabeza… jeje.
    mi pregunta es si este comando puede crear dentro de la tabla asignada, las columnas que le hagan falta para indexar los datos que recoge del txt, ya que así ahorraría el tener que crear manualmente para cada tabla unas 20 columnas… y no encuentro como hacerlo por ningun lado.

    si alguien pudiese ayudarme le estaria enormemente agradecido.

    1. No, LOAD DATA INFILE no puede crear las columnas necesarias, pero puedes llamar a un procedimiento almacenado que altere la tabla objetivo, tendrías que llamarlo durante la ejecución del LOAD DATA, ya que en LOAD DATA el objetivo debe existir …

  50. Hola, la pagina esta muy buena.
    Tengo el siguiente problema, cuando ejecuto el LOAD DATA INFILE no se el nombre del archivo solo se que es un txt. Hay alguna manera de indicarle que leea de ese directorio.
    Y luego con un secript se borraria el contenido de ese directorio para que no se vuelva a procesar dicho archivo.

    Sds
    Fabian

    1. Hola Syslog, podrías hacerlo en el interior de un procedimiento almacenado que tuviera acceso al directorio, explorando la existencia de un archivo txt y eliminándolo después

      Nunca lo he intentado, pero podría ser …

  51. hola, tus aportes son muy interesantes, pero sera q me puedes ayudar con lo siguiente. necesito la sintaxis para ingresar datos .txt a una bd por medio de load data local infile, pero que me reconozca las ñ. la verdad no se como utilizar los comandos que estas dando. ayudame por favor, estoy empezando.l

    1. Recuerda, si vas a trabajar con carácteres extendidos (como la ñ) en mySQL, recuerda primero definir que utilizarás UTF-8 al inicio de cada conexión, ejecuta:
      SET NAMES ‘UTF8’ y SET CHARACTER SET ‘UTF8’ y así fijarás que toda conexión transmitirá usando UTF8, además, si el comando LOAD DATA INFILE leerá archivos txt generados en Windows u otro sistema que utilice latin1 (ISO-8859-1), tendrás que convertir las cadenas a UTF8, utilizando el lenguaje que tengas previsto …

      1. Hola, ingreso a mysql
        Enter password: *****
        luego digito:
        mysql> SET NAMES ‘UTF8’;
        Query OK, 0 rows affected (0.00 sec)

        mysql> SET CHARACTER SET ‘UTF8’;
        Query OK, 0 rows affected (0.00 sec)

        pero no me sale, siempre las palabras que tiene «ñ» salen como : LONDO├æO.

      2. Una manera muy simple de garantizar la compatibilidad es abrir el documento .txt con el editor de notas de windows (el sencillito) y grabarlo como ansi. Cuando lo abres con Mysql reconoce todos los caracteres.

  52. buenas! perdon pero soy algo nuevo con esto, que puedo hacer si tengo en un archivo en un campo id «200-1232» y lo quiero convertir a «2001232» para que sea un entero? Gracias por sus respuestas! (y)

  53. Hola, fíjate que lo estoy haciendo con archivo separado por tabulador.. Le doy la ruta, o no y en ambos casos me dice archivo no encontrado…¿?que hago¿?
    Gracias

  54. Excelente casi si que no encuentro como se hacia eso!!!!!!!!!! muy bien…… y casualmente tambien tenia el problema de la fecha……….. Gracias

  55. Buenas Tardes amigo estoy usando este comando para cargar la data de varias tablas desde un txt anteriormente funcionaba solo guardaba la data de que correspondia a dicha tabla luego volvia a ejecutarlo cambiando el nombre de la tabla y guardaba los registros q correspondian a la misma pero ahora no separa uno de otros sino que gusrada en una misma tabla sin importar si pertenecen o no a la misma, espero me puedas ayudar gracias

  56. hola quiesieras ayuda estoy subiendo un txt a mysql con un campo que representa una fecha ejemplo 04110315 y se leeria asi mes 4 dia 11 hora 3:15 pm me podrias ayudar a realizar la trasformacion para guardarlo en la base de datos!

  57. hola tengo un problema, tengo dos tablas en la misma usb (E:\) y al cargar la primera (load data infile ‘E:\llantas.csv’ into table llantas fields terminated by ‘,’) todo muy bien pero cuando pongo la segunda (load data infile ‘E:\rines.csv’ into table rines fields terminated by ‘,’) me aparece:
    ines.csv’ not found (Errorcode: 2 – No such file or directory)
    ayudame porfiii :c

    1. \r (del «E:\r ines») es un símbolo de escape (retorno de carro), escapa ese carácter (así: \\, lo pones dos veces, quedando E:\\rines.csv) o en su defecto, ponle otro nombre para que no empiece en \r.
      Saludos!

  58. Hola q tal este ejemplo puede ser usado para cargar mas de un archivo csv a varias tablas ?? Como seria la sintaxis, espero q puedas ayudarme

  59. Muuuy buen Blog, Felicitaciones. Por favor, me puedes ayudar?
    Tengo un csv el cual tiene la siguiente estructura:
    Fecha,hora,elemento1,concentracion1,elemento2,concentracion2…..elementoX,concentracionX,programa,tarea*
    Fecha,hora,elemento2,concentracion2,elemento4,concentracion4…..elementoY,concentracionY,programa,tarea*
    esto deberia subir a la tabla mysql:
    Fecha | hora | elemento1 | elemento2 | … | elemento4 | … | elementoY | elementoX | Programa | Tarea

    Muchas gracias por tu tiewmpo

      1. Gracias por tu respuesta, y disculpa por insistir, creo q no me explico bien. En el csv, la primera linea tiene un orden:
        Fecha1,hora1,Sn,0.1511,As,0.1111,Sb,4.1122…..PROG,task*
        la segunda linea tiene el siguiente orden:
        Fecha2,hora2,As,1.2244,Bi,2.1144,…..,PROG.TASK*

        Al subir la data a la DB de MySQL deberia quedar asi:

        FECHA HORA As Sb Bi Sn…. PROG,TASK
        Fecha1 hora1 0.1111 4.1122 0.1511 PROG TASK
        Fecha2 hora2 1.2244 2.1144 PROG TASK

        me podrias ayudar con el codigo???

  60. Muchas gracias por toda esta información. La verdad es que me ha sido muy útil y me ha ayudado mucho en esta tarea.
    Quería preguntarte unas dudas con respecto al post.

    1) Tengo varias carpetas con multiples 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?

    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 por ejemplo: perico_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) 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 campo1 campo2 campo3
    XXXX 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, hay un nombre que necesito, pero claro, al hacer el ignore.. pasa del tema.

    El archivo sería como el anterior

    FILA 1 —> pepito
    FILA 2 —>
    FILA 3 —>
    FILA 4 —> campo1,campo2,campo3
    FILA 5 —> aaaa,bbbb,cccc
    FILA 6 —> dddd,eeee,fffff

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

    campoX campo0 campo1 campo2 campo3
    XXXX pepito aaaa bbbb cccc
    XXXX pepito dddd eeee fffff

    Muchísimas gracias de antemano y espero que puedas ayudarme, y enhorabuena por el post, que ya ves como años después, aún nos sigue ayudando a mucha gente!!!

Replica a avanzaweb Cancelar la respuesta