PHP (08) Archivos (01) Abriendo archivos con fopen
Antes de trabajar con un archivo hay abrirlo, para ello se utiliza la siguiente instrucción:
$filehandle = fopen (filename, mode [, use_include_path [, zcontext]])
Donde podemos ver como se utiliza la función fopen() con una serie de argumentos:
- filename: nombre del archivo que se va a abrir
- mode: forma en la que se quiere abrir, para leerlo, escribir en el…
- use_inclide_path: puede establecerse en 1 o en TRUE para especificar que desea buscar el archivo en la ruta de inclusión de PHP.
- zcontext: aloja un contexto de archivo opcional:
- ‘r’ Abrir sólo para lectura.
- ‘r+’ Abrir para lectura y escritura.
- ‘w’ Abrir sólo para escritura y truncar el archivo en longitud cero. Si el archivo no
existe, intente crearlo. - ‘w+’ Abrir para lectura y escritura y truncar el archivo a longitud cero. Si el archivo
no existe, intente crearlo. - ‘a’ Abrir sólo para anexar. Si el archivo no existe, intente crearlo.
- ‘a+’ Abrir para lectura y escritura, comenzando al final del archivo. Si el archivo no
existe, intente crearlo. - ‘x’ Crear y abrir sólo para escritura. Si el archivo ya existe, la llamada fopen fallará
devolviendo FALSE. - ‘x+’ Crear y abrir para lectura y escritura. Si el archivo ya existe, la llamada fopen
fallará devolviendo FALSE.
Observa que diferentes sistemas operativos tienen diferentes convenciones para finalizar líneas. Cuando escribimos un archivo de texto y deseamos insertar un cambio de línea, necesitamos utilizar el o los caracteres de final de línea correctos para nuestro sistema operativo. Los sistemas basados en Unix usan \n como carácter de final de línea; los sistemas con Windows utilizan \r\n, mientras los sistemas Macintosh utilizan \r para el mismo efecto.
En Windows, se puede emplear una bandera de traducción en modo de texto (‘t’), que traducirá \n a \r\n cuando trabaje con el archivo. En contraste, también se puede usar ‘b’ para forzar el modo binario, que no traducirá sus datos.
Para usar estas banderas, especifique ‘b’ o ‘t’ como el último carácter del parámetro modo, como ‘wt’.
En este momento, el modo predeterminado está en binario para todas las plataformas distinguiendo entre modo binario y de texto. Si tiene problemas con sus scripts, pruebe usar la bandera ‘t’
A continuación vamos a abrir un archivo que hemos creado en archivo\file.txt
Para ello usaremos la instrucción
$handle = fopen("/home/file.txt", "r");
hemos puesto las barras invertidas ya que pueden leerse tanto en windows como en Linux.
En la dirección se pueden poner direcciones URL o los datos de acceso a ftp como vemos a continuacion:
$handle = fopen("direccion URL", "r"); $handle = fopen("ftp://usuario:contraseña@servidor/file.txt", "w");
Finalmente hemos de saber que si el archivo se abre correctamente nos devuelve TRUE y en caso contrario false, de este modo podemos saber si se ha cogido o no correctamente utilizando una simple instrucción if:
<?php $handle = fopen("archivo/file.txt", "w"); if($handle){ echo 'El archivo se ha abierto correctamente'; }else{ echo 'ERROR AL ABRIR EL ARCHIVO'; } ?>
Lo cual al jecutarlo nos da como resultado:
El archivo se ha abierto correctamente
tengo problema al abrir un csv, lo quiero abrir de una ruta «C:/carpeta/archivo.csv» directamente y despues insertarlo en mysql en un servidor en la nube solo que no me lee el csv me arroja los datos en 0. podrías ayudarme?, aqui el codigo con el que estoy intentando
-p h p
ini_set(‘display_errors’, 1);
error_reporting(E_ALL);
$db_host = ‘midominioentelmex.com’;
$db_user = ‘usuario’;
$db_pass = ‘contraseña’;
$database = ‘bd’;
$table = ‘tabla’;
if (!mysql_connect($db_host, $db_user, $db_pass))
die(«No se pudo establecer conexion a la base de datos»);
if (!mysql_select_db($database))
die(«base de datos no existe»);
$handle = fopen(«C:\archivo.csv», «r»);
while (($data = fgetcsv($handle, 10000, «,»)) !== FALSE)
{
$sql = «INSERT into tabla(dato1,daton)values(‘$data[0]’,’$data[n]’)»;
// son al rededor de 40 campos en la tabla
mysql_query($sql) or die(mysql_error());
}
fclose($handle);
echo «Importacion exitosa \r\n»;
?>
De forma sencilla puedes modificar tu código para que lea del archivo csv. Yo te voy a poner como leerlo de forma directa y que el código lo vaya partiendo a partir de la separación de punto y coma. Todos los condicionales de control y lectura así como la conexión a la base de datos la pones segun tus necesidades:
El código lo he probado y funciona, espero haberte resuelto la duda.
Para la conexión y la importación puedes consultar mi entrada de importación de csv a mysql
veo que lo único que cambio fue la referencia de separacion a «;» yo en el codigo que le puse anteriormente tengo que es separado por «,» y es por que los tengo con «,» el problema es que en mi csv hay esto:
«dato1,numero1,dato2,numero2″. y al insertar pone » ,0 , ,0″ ya probe varias formas y no e encontrado la solución, no se si el problema este al abrir el csv o si al importarlo en el servidor, quiero recalcar que el archivo csv esta en mi disco local C, y el servidor es de telmex: dominio.com. de antemano gracias
¿Es posible que sea el formato del csv entonces?
gracias encontré el error, no era usuario root en el servidor, el código estaba bien
Esas cosas suelen pasar 🙂
tengo problema al abrir un csv, lo quiero abrir de una ruta «C:/carpeta/archivo.csv» directamente y despues insertarlo en mysql en un servidor en la nube solo que no me lee el csv me arroja los datos en 0. podrías ayudarme?, aqui el codigo con el que estoy intentando