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:

7 comentarios hasta ahora

  1. fernanda gonzalez on Octubre 19, 2007

    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 Octubre 19, 2007

    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 Diciembre 12, 2007

    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 Diciembre 18, 2007

    $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 Enero 16, 2008

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

  6. rusbel on Enero 21, 2008

    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 Enero 21, 2008

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

Leave a reply