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);
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
Hola, creo que el siguiente código te ayudará:
«;
}
}
fclose($fp);
?>
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)
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
Mi notebook tiene 8 en RAM, y pude leer 660mil registros en 19,84 segundos de un archivos.csv con 13 campos.
Gracias
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»;
?>
Excelente explicación. Pude implementarla y hacerla funcionar inmediatamente. Muchas gracias!
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 !
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
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
Hola buenos días,
Para este tipo de ayudas que se salen de lo que hay en el blog debe enviarnos un ticket al centro de soporte y allí le indicaremos como podemos proceder:
https://www.jose-aguilar.com/soporte/
Saludos
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?
Hola,
Creo que debes jugar con las funciones de php addslashes, etc
http://php.net/manual/es/function.addslashes.php
Saludos
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
Hola, me temo que son demasiados registros, no lo puedes importar por partes?
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
estoy mirando precisamente, podrias explicarme como lo hiciste? Gracias
hola solo para saber si tienes el archivo para compartir gracias
Hola, todo el código que se usa en el ejemplo está implícito en el artículo
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.