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:

  1. Guardar el archivo de datos que está en Excel como archivo separado por comas (.csv)
  2. Colocar ese archivo donde el servidor web tenga acceso.
  3. Crear un archivo PHP que lea el archivo, le coloque sintaxis sql, y así, lo ingrese a la Base de Datos.
  4. Ejecutar la pagina .php
  5. 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

  1. fernanda gonzalez on

    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

  2. JoG on

    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.

  3. lore on

    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

  4. marie on

    $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

  5. jose tito on

    Ok Amigo, si me funciono,….. gracias por tus aportes……..

  6. rusbel on

    mi problema es que tengo barios txt a cada minuto se genera un txt como capturo y subo ami base de datos mysql

  7. JoG on

    @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.

  8. Agustin on

    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!

  9. JoG on

    @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

  10. john on

    agustin puedes compartir el codigo para ver estoy en las mismas te lo agradesco saludos

  11. Fredy Rodriguez on

    Funciona perfecto mil y mil gracias era justo lo que necesitaba.

  12. BSAA on

    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?

  13. JoG on

    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 = 30 y 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 60 en el archivo .httaccess Guarda, y reinicia el servidor

    Prueba y cuéntanos si te funciona

  14. Alan on

    Alguien podria mandar el código completo con las correciones
    porq me sale un error en
    $data[$c]=str_replace(’;’,’\’,\”,$data[$c]);
    gracias

  15. JoG on

    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]);

  16. Alan on

    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);

  17. Malcom on

    Gracias amigo por este codigo me sirvio de mucho

  18. cristian on

    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

  19. Novato on

    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.

  20. Camilo on

    Muchas gracias por tu código, funciona sin problemas solo es cambiar datos de usuario y de la base datos.

    Muchas gracias.

  21. Bonifacio on

    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

  22. JoG on

    @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.

  23. DMN on

    Gracias por el script funciono de maravilla.

  24. Ferahe on

    Me funciono muy bien, solo que tengo un problema, ¿con un mismo archivo puedo meter datos a dos tablas diferentes de la mima base?

  25. JoG on

    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

  26. ELVIS on

    Allinmi allinta ankay codigo ,,,
    En castellano el codigo funciona correctamente

  27. William on

    Xevere el Script me saco de un apuro por q me taba haciendo bolas en importar a my base de datos MYSQL.

  28. Rafael R on

    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…

  29. neo on

    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

  30. Romina on

    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

    • Rauldeen on

      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


Replica