Subir datos desde un archivo .CSV a una BD MySql
No se han topado con este problema? bueno, les cuento mi experiencia.
Subí una BD a un servidor MySQL, creada con scripts (archivos de texto con sintaxis SQL) pero luego me topé con el problema, que los datos (y muchos) que iba a contener una tabla de la BD, me los proporcionarían en un archivo de Excel. Cómo hacerlo? Me valí de la potencia del php, afortunadamente, estaba en un sistema LAMP, así que no resultó complicada la solucion. A continuación detallo los pasos:
- Guardar el archivo de datos que está en Excel como archivo separado por comas (.csv)
- Colocar ese archivo donde el servidor web tenga acceso.
- Crear un archivo PHP que lea el archivo, le coloque sintaxis sql, y así, lo ingrese a la Base de Datos.
- Ejecutar la pagina .php
- Listo
A continuación les dejo el script php:
<?php
function Conectarse()
{
if (!($link=mysql_connect("localhost","miusuario","mipassword"))) {
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db("mibd",$link)) {
echo "Error seleccionando la base de datos.";
exit();
}
return $link;
}
$row = 1;
$handle = fopen("datos.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
$cadena = "insert into miTabla(Campo1,Campo2,Campo3,Campo4) values(";
for ($c=0; $c < $num; $c++) {
if ($c==($num-1))
$cadena = $cadena."'".$data[$c] . "'";
else
$cadena = $cadena."'".$data[$c] . "',";
}
$cadena = $cadena.");";
echo $cadena."<br>";
$enlace=Conectarse();
$result=mysql_query($cadena, $enlace);
mysql_close($enlace);
}
fclose($handle);
?>
<h2>Se insertaron <?php echo $row ?> Registros en la tabla miTabla</h2>
Tags relacionados en Blogalaxia:
31 comentarios hasta ahora
Replica




hola probe el cod y no funciona al abrir la tabla no aparece nada de la informacion que supuestamente subio y ademas muestra todo el codigo en la pagina no se que pasa y ya revise igual muchas gracias
Revisa si tienes correcto:
- Nombre del servidor (en mi caso, ‘localhost’)
- Nombre de la Base de Datos, el usuario y el password
- Nombre de la ruta y del archivo .csv
- Nombre de la tabla, y de los campos.
Aunque creo que puede ser porque la sintaxis de entrada no es la correcta, para ello revisa bien los nombres de los campos donde los estas insertando. Para una prueba, inserta desde consola un solo registro, (algo asi como
insert into Persona(nombre, edad, nacionalidad) values ('Juanito Perez', 15, 'guatemalteco');y alli veras los posibles errores que te pueda dar en consola mysql. Arregla la cadena a modo que pueda ser una cadena valida, y luego arregla la cadena del PHP.
Revisa bien tus datos de entrada, ya que toma en cuenta que podrian traer apostrofos (‘) y eso podria causar problema
Suerte.
lo que sucede es que el script tira lineas del tipo:
insert into Persona(nombre, edad, nacionalidad) values (‘Juanito Perez; 15 ; guatemalteco’);
no separa con , sino que lo hace con ; y no coloca los apostrofes (‘) entre las comas, por lo que dice q el numero de campos a insertar no coincide con los que hay en la tabla
ademas el for que aparece ahi no sirve porque tira todos los campos en una sola linea, para arreglarlo basta esta linea:
$data[$c]=str_replace(‘;’,'\’,\”,$data[$c]);
antes del for
$data[$c]=str_replace(’;’,’\’,\”,$data[$c]); no entiendo que cadena esta comparando y tratando de separar el asunto es q da error no entiendo que hace por favor
podrias explicarme para tratar de arreglarlo Lore por favor
Ok Amigo, si me funciono,….. gracias por tus aportes……..
mi problema es que tengo barios txt a cada minuto se genera un txt como capturo y subo ami base de datos mysql
@rusbel:
podrías explicarlo mejor?
Los txt que hablas son archivos que contienen datos para guardar en una tabla?
Si es así… Cómo son generados esos archivos? talvez al momento de generarse, se puede guardar a la BD. No se si estoy mal.
A mi no me funciono, pero modificando un poco el codigo logre que imprima en pantalla los datos para ingresar en el SQL de phpmyadmin, asi que realmente fue muy util ya que traje una base de datos de excel de 10000 productos aprox… me sacaste de un lio! gracias!
@Agustin: Que bueno que lograste hacer tu trabajo y me alegra haber podido ayudarte.
Otra cosa… nos podrias compartir qué problema tuviste y como lo solucionaste? Gracias
agustin puedes compartir el codigo para ver estoy en las mismas te lo agradesco saludos
Funciona perfecto mil y mil gracias era justo lo que necesitaba.
A mi funcionó, pero sólo me inserta 600 registro de 5,153, me envía el siguiente error:
Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\Jurado\sube_archivos.php on line 32.
Saben como solucionar esto?
Hola BSAA, tu problema puede ser por varias razones:
-Como indiqué antes, revisa muy bien tus datos de entrada que no contengan algun caracter que de problema y cause un bucle infinito, como el apóstrofo (‘), o comilla, ya que éste crearía confusión en la cadena que se crea. Intenta evitarlo, y si no se puede, pues intenta “parsear” la cadena para ir buscando ese apóstrofo y reemplazarlo.
- Si ya te diste cuenta que todos tus datos están bien, Puede ser que realmente sea problema del límite configurado en PHP. Busca el archivo “php.ini” y edita la parte:
max_execution_time = 30y auméntale a 120. Guarda, y reinicia tu Webserver- Si eso no da resultado, puedes también cambiar un parámetro de Apache: puedes agregar (o buscar) la linea
php_value max_execution_time 60en el archivo .httaccess Guarda, y reinicia el servidorPrueba y cuéntanos si te funciona
Alguien podria mandar el código completo con las correciones
porq me sale un error en
$data[$c]=str_replace(’;’,’\’,\”,$data[$c]);
gracias
Hola Alan, el script así como está funciona, pero si tienes el mismo problema que lore, que el script te da resultados del tipo:
insert into Persona(nombre, edad, nacionalidad) values (’Juanito Perez; 15 ; guatemalteco’);la linea correcta que hay que agregar sería:
$data[$c]=str_replace(";","’, ”, $data[$c]);Hola JOG entonces quedaria asi??? porque me da este error:
Parse error: syntax error, unexpected ‘;’ in …\prueba.php on line 29
$row = 1;
$handle = fopen(“datos.csv”, “r”);
while (($data = fgetcsv($handle, 1000, “,”)) !== FALSE) {
$num = count($data);
$row++;
$cadena = “insert into miTabla(Campo1,Campo2,Campo3,Campo4) values(“;
$data[$c]=str_replace(”;”,”’, ”, $data[$c]);//ESTA ES LA LINEA 29
for ($c=0; $c < $num; $c++) {
if ($c==($num-1))
$cadena = $cadena.”‘”.$data[$c] . “‘”;
else
$cadena = $cadena.”‘”.$data[$c] . “‘,”;
}
$cadena = $cadena.”);”;
echo $cadena.”";
$enlace=Conectarse();
$result=mysql_query($cadena, $enlace);
mysql_close($enlace);
}
fclose($handle);
Gracias amigo por este codigo me sirvio de mucho
Hola.. gracias por el código a mi me sirvio demasiado, pero tengo problemas, te cuento. En el PC donde estoy trabajando la carga masiva de datos mediante el archivo .csv funciona perfecto tanto localmente como en el servidor q esta en otro PC todo esto creando el archivo .csv aca en mi estacion de trabajo. El problema surge cuando en otros PC’s q estan en la red intento hacer la carga masiva creando en ellos los archivos CSV no lo inserta, pero si yo los creo en mi estacion de trabajo y los comparto en red mediante carpeta compartida, funciona…
Pero.. al intentar abrir el archivo se visualiza todo en una sola celda… q problemas puede ser?
Espero me puedas ayudar… saludos
Muchas gracias por el codigo, pero tengo un problemilla estoy usando este codigo creo que es el correcto
<?php
function Conectarse()
{
if (!($link=mysql_connect(“localhost:8888″,”xxx”,”xxx”))) {
echo “Error conectando a la base de datos.”;
exit();
}
if (!mysql_select_db(“ColegioMedicos”,$link)) {
echo “Error seleccionando la base de datos.”;
exit();
}
return $link;
}
$row = 1;
$handle = fopen(“colegiados.csv”, “r”);
while (($data = fgetcsv($handle, 1000, “,”)) !== FALSE) {
$num = count($data);
$row++;
$cadena = “insert into colegiados(codigo,apellido1,apellido2,nombre,calle) values(“;
$data[$c]=str_replace(”;”,”’, ”, $data[$c]);
for ($c=0; $c < $num; $c++) {
if ($c==($num-1))
$cadena = $cadena.”‘”.$data[$c] . “‘”;
else
$cadena = $cadena.”‘”.$data[$c] . “‘,”;
}
$cadena = $cadena.”);”;
echo $cadena.”";
$enlace=Conectarse();
$result=mysql_query($cadena, $enlace);
mysql_close($enlace);
}
fclose($handle);
?>
Se insertaron Registros en la tabla miTabla
Y el fichero csv tiene esta forma
20000;xxx;yyyyy;zzzzz;uuuuuuuuu
0000000;dasdasd;dasdas;dsada;asdsd
y tras su ejecución pues no hace nada de nada y no se que puede ser le he dado ya muchas vueltas.
Muchas gracias.
Muchas gracias por tu código, funciona sin problemas solo es cambiar datos de usuario y de la base datos.
Muchas gracias.
tengo un problema, cuando ejecuto el script me pone esto en la web
INSERT INTO tabla VALUES (‘993837′,’demo’,'demo’,'demo’,'demo’,'demo’,”2009-04-03”);
Fatal error: Function name must be a string in /home/supervisor/www/temp/subircsv.php on line 22
Veo que es el doble apostofre del ultimo campo, pero no logro quitarlo. he modificado el script asi:
$cadena=$cadena.$data[$c];
else
$cadena=$cadena.$data[$c].”,”;
Esto porque en mi CSV tengo los datos en apostrofes.
en la linea 22 tengo:
$result=mysql_query($cadena,$enlace);
Espero me puedan ayudar
@Bonifacio: Podrías colocar una lína de ejemplo de tu archivo CSV? porque si dices que tienes datos con apóstrofes habrá que manipular esas valores antes de insertarlas a la cadena SQL.
Gracias por el script funciono de maravilla.
Me funciono muy bien, solo que tengo un problema, ¿con un mismo archivo puedo meter datos a dos tablas diferentes de la mima base?
Claro que sí puedes, lo único que tienes que hacer es armar correctamente la cadena con la sintaxis sql la cual insertará los datos en la tabla2. De manera que quede algo similar a:
$cadena2 = “insert into miTabla2(Campo1,Campo2,Campo3) values(valor1, valor2,valor3)”;
y luego despues del primer mysql_query, llamarlo nuevamente con la otra cadena:
$result=mysql_query($cadena2, $enlace);
El ‘reto’ sería armar la $cadena2, de la misma forma que se armaste $cadena.
Saludos
Allinmi allinta ankay codigo ,,,
En castellano el codigo funciona correctamente
Xevere el Script me saco de un apuro por q me taba haciendo bolas en importar a my base de datos MYSQL.
Señores es mas sencillo para los que necesiten solo manejar un tipo de carga delimitadora de csv…
en la linea:
$data = fgetcsv($handle, 1000, “,”)
recuerden que el fgetcsv($handre, #delineas, “delimitado”
el delimitador por defecto es la COMA “,” pero si están exportandolo desde excel, colocar simplemente un “;”
la linea de arriba está bien pero para no dañar más la cabeza simplemente cambien la linea desde ahi….
Probado y comprobado…
hola tengo este problema ejecuto el archivo y me sale esto en la apgina
insert into almacen(Campo1,Campo2,Campo3,Campo4) values(‘zapatilla’,'azul’,'deporte’,'2000′);
insert into almacen(Campo1,Campo2,Campo3,Campo4) values(‘a’,'negro’,'aso’,'500000′);
insert into almacen(Campo1,Campo2,Campo3,Campo4) values(‘b’,'rosa’,'lavado’,'1000′);
insert into almacen(Campo1,Campo2,Campo3,Campo4) values(‘c’,'naranjo’,'hola’,'1000000000′);
Se insertaron 4 Registros en la tabla miTabla
pero no insterta nada en la base de dato alquien me puede ayudar
hola tengo un problema con el codigo y lo necesito urgente de evrdad a q estoy haciendo un trabjo y necesito buscar un archivo en exel y exportalo a mysql pero probe el c0digo y me sale esto cuando lo ejecuto en la web
insert into almacen(idAlmacen,articulo,color,material,precio) values(‘zapatilla;azul;deporte;2000′);
insert into almacen(idAlmacen,articulo,color,material,precio) values(‘a;negro;aso;500000′);
insert into almacen(idAlmacen,articulo,color,material,precio) values(‘b;rosa;lavado;1000′);
insert into almacen(idAlmacen,articulo,color,material,precio) values(‘c;naranjo;hola;1000000000′);
Se insertaron 5 Registros en la tabla miTabla
y ya probe la consulta y noo se que puede ser si laguien me ayuda porfa urgente
esto lo necesitas hacer con un archivo excel o puede ser con un csv, yo tengo un codigo para enviar datos desde php hacia mysql pero solo con archivos csv. avisame si te sirve