importar hojas de excel a mysql

Upload: antonio-jorge

Post on 12-Jul-2015

511 views

Category:

Documents


1 download

TRANSCRIPT

Importar hojas de Excel a MySQLA veces puede ser interesante ofrecer al usuario el poder actualizar datos de una base de datos MySQL utilizando como fuente un fichero *.csv generado por Excel MySQL es capaz de importar datos no slo a travs de archivos con sentencias SQL, sino tambien desde ficheros CSV exportados desde una hoja de calculo como MS Excel a traves de la funcion LOAD DATA INFILE. En este tutorial no veremos todas las posibilidades que la funcin ofrece. Nos centraremos en aquellas de uso ms comn, pero que se adaptan al 95% de las situaciones en que vayamos a encontrarnos. Para saber ms sobre la misma podis consultar el manual de MySQL En la mayora de los casos, la funcin tendr un aspecto como ste: LOAD DATA LOCAL INFILE nombreArchivo REPLACE INTO TABLE miTabla FIELDS TERMINATED BY , LINES TERMINATED BY \n\r IGNORE 1 LINES (columna1,columna2) ?Qu significa todo esto? Vamos a verlo paso a paso: LOAD DATA LOCAL INFILE nombreArchivo MySQL tiene 2 caminos para leer el archivo .csv: 1. 2. Leerlo directamente el servidor Conectarse con el cliente y leerlo a travs de l

La primera posibiliidad es muy rapida en su ejecucin (Es el propio servidor el que ejecuta la operacin), pero necesita de ms permisos (FILE, por ejemplo, que no siempre est activado para usuarios normales). En el segundo caso (gracias a la opcion LOCAL) MySQL crea una conexin con el cliente y, a travs de ella, comienza a leer el archivo. El sistema es un poco ms lento, pero a cambio no se necesitan permisos especiales tipo FILE. En este caso, sin embargo, es necesario que mysqld haya sido inciado con la opcin --local-infile=1 Por lo tanto: LOAD DATA LOCAL INFILE indica que utilizaremos el segundo sistema LOAD DATA LOCAL INFILE nombreArchivo REPLACE INTO TABLE tableName La opcin REPLACE (y su opuesta IGNORE) controlan la entrada de registros que tengan una clave ya existente en la tabla. REPLACE provoca que el registro reemplace el ya existente. IGNORE, en cambio, ignora el nuevo registro sin modificar el existente. Al utilizar en nuestro caso la opcion LOCAL ste es el valor definido por defecto, por lo que: LOAD DATA LOCAL INFILE nombreArchivo IGNORE INTO TABLE miTabla y: LOAD DATA LOCAL INFILE nombreArchivo INTO TABLE miTabla Son 2 sentencias identicas. Opciones de separacion de datos: 1.- FIELDS/LINES TERMINATED BY: Estas opciones nos permiten indicar qu simbolos son los que separan cada campo y linea, respectivamente, del archivo *.csv. Algunos ejemplos pueden ser:

FIELDS TERMINATED BY , (separados por comas) FIELDS TERMINATED BY ; (separados por punto y coma) FIELDS TERMINATED BY \t (separados por tabulaciones) t Y para indicar el separador de cada linea: LINES TERMINATED BY \n\r 2.- IGNORE XX LINES Esta opcion permiteindicar si la(s) primera(s) linea(s) del fichero *.csv contiene algun otro tipo de del informacion que no debe ser insertada en la tabla. El ejemplo mas habitual es cuando esta primera linea se utiliza en excel para mostrar los titulos de cada fila, en cuyo caso deberiamos escribir: IGNORE 1 LINES SUPUESTO PRACTICO Como supuesto prctico hemos decidido que nuestro futuro usuario ya conoce que, al exportar desde Excel, debe utilizar punto y coma para separar cada campo y cada linea del fichero se corresponde con un registro en la tabla. Al mismo tiempo, hemos asumido que la primera fila incluye el titulo de cada tiempo, columna y que la hoja de calculo contenia un campo de indice. Nuestro ejemplo tambien asumira que la hoja de calculo debe actualizar los registros actuales de la tabla (por lo que utilizaremo REPLACE) utilizaremos Empezaremos creando el formulario que permitir al usuario seleccionar el fichero csv:

Como veis, simplemente hemos creado el formulario y un input que permita al usuario seleccionar el fichero csv. Vayamos ahora al lado servidor. En el mismo documento, insertaremos algo de PHP que procese el fichero seleccionado y lo inserte en la Base de datos La consulta base ser algo como esto (de momento slo debes cambiar el valor para miTabla): LOAD DATA LOCAL INFILE nombreArchivo REPLACE INTO TABLE miTabla FIELDS TERMINATED BY OCAL ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES n' Simplemente observad a continuacin que el parametro nombreArchivo tiene como valor el equivalente al campo del formulario csv, que se corresponde con el nombre del input de nuestro formulario (Se ha , intentado simplificar el cdigo al mximo para centrarnos en la consulta) if (isset($_POST['csv']){ uploadQuery="LOAD DATA LOCAL INFILE ".$csv." REPLACE INTO TABLE miTabla FIELDS TERMINATED BY';' LINES TERMINATED BY ''\r\n' IGNORE 1 LINES"; mysql_query($uploadQuery) or die("error:".mysql_error()); } Para poder verlo con ms claridad (gracias por el comentario, Francis), podeis ulsar aqui y bajaros unos archivo de ejemploPuedes seguir las respuestas a este post mediante nuestro RSS 2.0 feed. Puedes dejar una respuesta o respuesta, un trackback desde tu sitio. subscribete a los comentarios en formato RSS Hay 15 comentarios en este post.

1. rusbel 09/01/2008 a las 2:34 pm

hola: me gustaria que me brindara un ejemplo ya terminado .. me interesa el tema mi proble ma es que tengo un monton de txt y quero pasarlos a mi base de datos mysql esto debe ser en linea onton agradecere su ayuda ..

2. francis 11/03/2008 a las 8:37 pm Algn Ejemplo????????

3. andres cayon 11/03/2008 a las 9:24 pm Hola Francis: Este es uno de los tutoriales heredados del antiguo sitio y ha perdido algo de informacin e el camino (culpa en del cambio de encoding) Prometo actualizarlo en unos das y puadjuntar algun ejemplo (alguien tiene tiempo libre para prestarme?) as

4. paco 19/06/2008 a las 9:31 pm Hola a todos estoy probando el ejemplo en el servidor local de mi compu pero al tratar de cargar el archivo csv, me sale este error error:File C:WINDOWSTEMPphp264A.tmp not found (Errcode: 2) alguien sabe porque me sale eso

5. andres cayon 19/06/2008 a las 11:43 pm Hola Paco: http://bugs.php.net/bug.php?id=7244 Prueba a cambiar $csv por addslashes($csv) No he leido el bug completo, pero puede ser una pista 8 8-)

6. paco 19/06/2008 a las 11:52 pm Gracias por tu ayuda Andres, estoy utilizando el archivo ejemplo que se encuentra al final del tutorial y en vez de utilizar $csv el codigo tiene if (isset($archivo)) { $query = LOAD DATA INFILE .$archivo. REPLACE INTO TABLE esmmug_load_data FIELDS TERMINATED BY , LINES TERMINATED BY \r\n IGNORE 1 LINES (id,nombre,edad); n mysql_query($query) or die(error:.mysql_error()); }

7. betty 16/07/2008 a las 5:01 pm

Hola me gustaria que me ayudaran al probar el ejemplo me marca este error:C:\WINDOWS\TEMP\php3.tmpREPLACE INTO TABLE esmmug_load_data FIELDS php3.tmpREPLACE TERMINATED at line 1 y ya estuve checando pero no se en donde este el error.

8. edgar martinez 06/08/2008 a las 2:22 pm Ejecuto el siguiente script no me sale ningun error pero tampoco me sube a la base de datos los registros de excel, que sera??????????????? AYUDAAAAAA

9. edgar martinez 06/08/2008 a las 4:32 pm Si utilizo la sentencia if (isset($_POST['csv']){.. no me ejecuta nada, en cambio si utilizo la sentencia if (isset($archivo){ me sale como error que la version de mysql no permite esta sentencia, ilustrenme por favor???

10. gabriel 20/08/2008 a las 1:19 pm Paco prueba con lo siguiente, seguramente funcione: if (isset($archivo)) { $archivo=addslashes ($archivo); $query = LOAD DATA INFILE LOAD .$archivo. REPLACE INTO TABLE esmmug_load_data FIELDS TERMINATED BY , LINES TERMINATED BY \r\n IGNORE 1 LINES (id,nombre,edad); mysql_query($query) or die(error:.mysql_error()); error:.mysql_error()); }

11. albert saa 11/11/2008 a las 1:42 pm hola, este post es de agosto y no se si lograre recibir respuesta, la cosa es k estoy intentando extraer la informacion de un excel para formar una tabla mysql. El script que ejecuto es el siguiente use mydb; LOAD DATA LOCAL INFILE C:\\\\ejemploAS400.csv INTO TABLE sistemas FIELDS TERMINATED BY ; LINES TERMINATED BY \r\n; Funciona casi correctamente, el problema es cuando llega al 3er campo, fecha, en este campo excel formata la fecha asi Ej. 11/08/2001, mientras que mysql la forma asi Ej 2001 2001-08-11, se os ocurre como hacer para que se entiendan????? Agradeceria muchisimo las posibles ayudas

12.

andres cayon

11/11/2008 a las 3:39 pm Hola Albert: La pregunta es: Inserta los campos aunque sea en dicho formato? Si lo hace, el problema no es importante: Slo hay que es darle formato a la salida (MySQL utiliza yyyy yyyy-mm-dd para almacenar fechas)

13. koiky 10/11/2010 a las 5:10 am Tengo una aplicacion de java que necesito que haga lo mismo, pero es una aplicacion de escritorio, aplique la linea de codigo en mysql pero me dice que el resultset no regreso nada, me pueden ayudar porfa? muchas gracias.

14. jairo s 07/12/2010 a las 10:36 pm Tengo la misma inquietud de Albert y no logro hacer que el formato de Mysql yyyy yyyy-mm-dd entienda el de Excel dd que viene mm-dd-yyyy. Y para datetime timestamp? agregando la hora? yyyy.

15. padagua 11/04/2011 a las 7:19 pm tengo un problema agradeceria la ayuda de alguien. tengo un archivo en excel csv y necesito pasar esa informacion a una base de datos mysql, si alguien me pudiera facilitar el codigo php se lo agradeceria mucho.