Leer archivo CSV con PHP

En el siguiente artículo explicamos de forma detallada como leer un archivo .csv para posteriormente procesar esos datos según se quiera. Se suele utilizar por ejemplo para importar los datos del .csv a alguna de nuestras tablas de la base de datos.

Lo primero que deberemos hacer es abrir el fichero .csv de la siguiente forma:

$fp = fopen ("archivo.csv","r");

En la variable $fp estamos guardando el puntero al archivo.csv que estamos abriendo en modo lectura.

A continuación, deberemos crear un bucle para recorrer las filas del archivo .csv. Algo como lo que sigue:

while ($data = fgetcsv ($fp, 1000, ";")) {
$num = count ($data);
print "";
echo $data[0].' -> '.$data[1];
}

La función fgetcsv() es la función clave del script que obtiene una línea del puntero a un archivo y la examina para tratar campos CSV. Cada linea del .csv es guardada en el array $data para posteriormente mostrar los datos de las celdas en pantalla.

$data[0] — Devuelve los datos que haya en la columna A.

$data[1] — Devuelve los datos que haya en la columna B.

Finalmente, solo falta cerrar el puntero.

 fclose ($fp);

Ver ejemplo en funcionamiento

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(8 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

20 respuestas a “Leer archivo CSV con PHP”

  1. Miguel Angel Díaz López dice:

    Hola Necesito de su ayuda
    Utilizando el código que usted tiene aquí y modificandolo logre extraer los datos que necesito de un archivo .csv quedando así
    <?php

    $fp = fopen ("plantilla1.csv","r");
    while ($data = fgetcsv ($fp, 1000, ";"))
    {
    $num = count ($data);
    echo "» .$data[0].’ ‘.$data[1].’ ‘.$data[2].’ ‘.$data[3];
    echo «»;
    }
    fclose ($fp);

    dentro de los datos extraídos esta el CI de los trabajadores de donde trabajo y tengo este otro código

    $ci=’7109120266’;

    //Extraer el Año
    $cumple[‘y’]=substr($ci,0,2);

    //Extraer el Mes
    $cumple[‘m’]=substr($ci,2,2);

    //Extraer el Día
    $cumple[‘d’]=substr($ci40,2);

    echo implode(‘-‘,$cumple);
    ?>

    Este código me lee el numero de CI que yo le ponga y me extrae la Fecha de nacimiento de la persona, que deseo unir los 2 código y que me muestre según el mes en el que estemos el día y el nombre completo de la personas que nacieron en ese mes.
    Como podría hacerlo. quisiera que me saliera algo así Ejemplo: mi carnet es 7109120266 pero debajo el nombre de otros trabajadores que cumplan año ese mismo mes
    12 Miguel Angel Díaz López
    17 Francisco Sael Díaz Delgado

  2. anapaula dice:

    necesito que me ayudes puse mi «archivo.csv» en mi servidor de mi pagina
    este se llena de datos mediante un formulario en linea
    ahora lo que quiero es visibilizar este archivo.csv en una pagina web php mediante una tabla, es decir a medida que se va llenando en la pagina que se vaya actualizando solo

    ayuda si me puedes compartir el codigo completo para yo pegarlo no mas jaja

    te adjunto mi pagina (es del trabajo)

    • Jose Aguilar dice:

      Hola,

      Si, nosotros ofrecemos ayuda adicional para casos que se salen de lo que tenemos por aquí gratuitamente. La idea es que envíes tu petición completa a través de nuestro centro de soporte técnico ubicado en:

      https://www.jamodules.com/es/soporte

      Allí podremos mantener un hilo para eestudiar tu caso y enviarte una propuesta de solución.

      Saludos

  3. Miguel Fuica dice:

    Mi notebook tiene 8 en RAM, y pude leer 660mil registros en 19,84 segundos de un archivos.csv con 13 campos.

    Gracias

  4. Miguel Fuica dice:

    Es una opción, puede que a alguien le sirva
    Con 8 Giga en Ram, se puede:
    Subir 300.000 registros desde un .csv a una base de datos mysqli
    Luego leerlos para extraer los duplicados… aunque demora unos minutos.

    query($consulta);

    while ($row = $resultado->fetch_array()) {

    $campo1 = $row[‘campo1’];
    .
    .
    $campo12 = $row[‘campo12’];

    $consulta1 = «insert into tabla_salida(campo1,…,campo12)

    values (

    ‘$campo1’,

    ‘$campo12’)»;

    $insertado = mysqli_query($mysql,$consulta1);

    if($insertado !=1){

    $consulta3 = «insert into tabla_de_duplicados(campo1,campo3, campo4,campo5,campo12) (puede copiar los campos que desee

    values (
    ‘$campo1’,
    ‘$campo3’,
    ‘$campo4’,
    ‘$campo5’,
    ‘$campo12’)»;

    mysqli_query($mysql,$consulta3);
    }
    }
    mysqli_close($mysql);
    echo «fin»;
    ?>

  5. Laura Márquez, Argentina dice:

    Excelente explicación. Pude implementarla y hacerla funcionar inmediatamente. Muchas gracias!

  6. Yilber Carrero dice:

    tengo problemas para ingresar un archivo csv a BD por que el archivo tiene lineas en blanco y uno de los campos viene en otra linea, entonces cada registro tiene 3 lineas de las cuales 2 son para ingresar a base de datos y la tercera para que saltar agradecería tu ayuda !

    • Jose Aguilar dice:

      Hola buenos días,

      Un poco extraño el csv pero si ya sabes el patrón en la iteración que recorre el archivo csv deberás hacer condiciones. Una de ellas es controlar que un registro se corresponde con 3 lineas. Lo puedes hacer con una variable contador. Quizá necesitaríamos ver el archivo csv que estás comentando para ver como se podría hacer. Si necesita más ayuda envíe un ticket al centro de soporte técnico -> https://www.jose-aguilar.com/soporte/. Allí veremos como podemos ayudarle.

      Saludos

  7. Juan Carlos dice:

    Buenos días,
    Por favor me podrías colaborar es que necesito pasar un parametro para ejecutar el stored procedure en sql server, el parametro seria la ruta donde esta el archivo .csv y ejecutar el stored procedure en sql server con php.
    Muchas gracias

  8. Antonio dice:

    Si tengo saltos de linea dentro de una misma celda, al procesarlos con php, ¿como hago que los respete y no considere cada salto una fila nueva?

  9. Walter Giordano dice:

    Buen dia Jose como estas?
    Estoy experiementando un problema de performance al levantar un archivo csv con 71000 registros, esta tardando 2 horas aproximadamente.
    Este es el codigo
    while (( $data = fgetcsv ( $fp , 0 , «;» )) !== FALSE ) { // Mientras hay líneas que leer…
    $a=0;
    foreach($data as $row) {
    $valores[$a]=$row;
    //if($valores[2]==»)
    // $valores[2]=0;

    if($a==12){

    //$ins=insertar_codigo($valores[2],$valores[1],$valores[7],$valores[5],$valores[0],$valores[6],$valores[3],$valores[4],$valores[8],$valores[9]);
    //busco el valor del almacen DP
    $depDP=strstr($valores[3],»DP»);
    if($depDPFalse){
    $ins=insertar_foto_stock($valores[0],$valores[1],$valores[2],$valores[3],$valores[4],$valores[5],$valores[6],$valores[7],$valores[8],$valores[9],$valores[10],$valores[11],$valores[12]);
    $tot++;
    $a=0;}
    }else
    $a++;

    }
    }

    Ya indexé tablas y todo pero aun sigue, me puedar dar una mano?
    Gracias

  10. Pep Sánchez C. (@PepInca) dice:

    Me ha venido genial para adaptar el catálogo de megasur en tiempo real con stock y todo a Prestashop desde php con CRON.

    Saludos Desde Mallorca..

    Gracias por tu ayuda. Aprendo mucho y muchos días gracias tu sitio web. Enhorabuena

  11. Miguel dice:

    hola solo para saber si tienes el archivo para compartir gracias

  12. Gilbert dice:

    Muy bien post, me sirvió mucho, ya que estaba ahceindo una importación de archivos desde excel, lo importaba bien, pero las tildes no. la base de datos está en oracle. Por lo tanto me toco convertirla a cvs.

    GRacias.

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre