Importar datos desde archivo CSV a BD en MySQL con PHP

import¡Hola a todos!

A continuación, les mostraré un código en PHP para poder hacer un proceso de importación de un archivo CSV hacia una base de datos en MySQL (o podría ser cualquier otro gestor de BD soportado por PHP). Quizás ésta entrada está de la mano a una anterior que publiqué: Crear un archivo CSV para exportar datos.

Voy a colorear por partes el código para medio explicar cada cosa….

  • En el bloque azul, hacemos la conexión con nuestra BD (donde queremos importar la data) y abrimos el archivo csv que queremos (en éste caso, esta ubicado en el mismo lugar donde esta el archivo .php, pero se le puede indicar cualquier otra ruta). Luego, hacemos un barrido del archivo CSV por cada línea, guardando cada campo en un Array llamado $linea , para que al final del bucle while podamos tener toda la data del archivo CSV en el arreglo; finalmente cerramos el archivo CSV.
  • En el bloque verde, inicializamos las variables que nos servirán de contadores y recorremos el Array generado en el bloque Azul para obtener los datos del mismos y así decidir qué hacer con cada registro.
  • En el bloque rojo, básicamente evaluamos si el registro del arreglo ya esta en la BD o no; Con base en eso último, se inserta el nuevo registro en la BD o se actualiza el registro existente con la nueva data que trae el array. También incrementamos los contadores dependiendo de la condición dada.
  • Finalmente, en el bloque naranja, mostramos el resumen de los registros insertados, actualizados o con errores (que se esperaría un cero xD ).

Bien, éste es el código:

<?php
   $con=@mysqli_connect("localhost", "root", "clave", "base_datos");
   $info = fopen ("info.csv" , "r" );
   while (($datos=fgetcsv($info,10000,",")) !== FALSE){
      $linea[]=array('codigo'=>$datos[0],'campo2'=>$datos[1],'campo3'=>$datos[2]);
   }
   fclose ($info);

   $insertados=0;
   $errores=0;
   $actualizados=0;
   foreach($linea as $indice=>$value){
      $codigo=$value["codigo"];
      $campo2=$value["campo2"];
      $campo3=$value["campo3"];

      $sql=mysqli_query($con,"select * from mitabla where codigo ='$codigo'");
      $num=mysqli_num_rows($sql);
      if ($num==0){
         $sql="insert into mitabla (codigo, campo2, campo3) values('$codigo','$campo2','$campo3')";
         if ($insert = mysqli_query($con,$sql)){
            $insertados+=1;
         }else{
            $errores+=1;
         }
      }else{
         $sql="update mitabla set campo2='$campo2', campo3='$campo3' where codigo='$codigo'";
         if ($update = mysqli_query($con,$sql)){
            $actualizados+=1;
         }else{
            $errores+=1;
         }
      }
   }

   echo "Registros insertados: ".number_format($insertados,2)." <br/>";
   echo "Registros actualizados: ".number_format($actualizados,2)." <br/>";
   echo "Errores: ".number_format($errores,2)." <br/>";
?>

Eso es todo. Espero que le sirva a alguien y pues… me imagino que me servirá también a mi en un futuro, dado que suelo necesitar hacer éste tipo de cosas por razones extrañas del destino xD

¡Saludos!

Comentarios por Facebook

comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*