Los archivos
Los distintos archivos
1. Preámbulo
Los archivos son difíciles de describir en términos algorítmicos. Durante años, hasta mediados de los noventa, COBOL reinó entre los lenguajes de programación de informática empresarial. Este lenguaje era tan potente en este campo como práctica era su sintaxis. Los que sepan algo de COBOL sabrán de qué estamos hablando. Una de las fuentes de su poder era su capacidad para manejar archivos y registros estructurados, en cualquier sentido, de cualquier forma.
Sin embargo, COBOL ha pasado de moda para los nuevos desarrollos. Multitud de archivos de datos diversos han sido sustituidos por otras estructuras, sobre todo bases de datos relacionales, con lo que el estudio de la mayoría de los tipos de archivos ha quedado obsoleto en favor de lenguajes como SQL. Sin embargo, las propias bases de datos se suelen almacenar en archivos.
Por ello, este capítulo es más breve que los demás. Sería posible describir toda una serie de tipos de archivos: existen libros completos sobre el tema.
Se cubrirán en gran medida las bases teóricas y las definiciones, pero sólo se tratarán los archivos de texto. PHP no sabe cómo manejar archivos indexados directamente, así que esto resuelve el problema.
2. Problemática
¿Qué es un archivo? Encontrar información en archivos es exactamente igual que en el mundo real. Cuando tiene un único dato que recordar en la cabeza, es fácil. Cuando tienes miles, es misión imposible. Utiliza una agenda y rellena fichas. No cabe duda de que el cerebro tiene unas capacidades increíbles, pero ¿cómo recordar todas las transacciones bancarias de millones de cuentas bancarias?
A esto se añaden dos problemas:
-
A pesar de la potencia de sus ordenadores, la capacidad de memoria suele ser limitada. Un ordenador "estándar" de 32 bits (de sobremesa, de juegos) suele estar limitado a 8 GB. Algunas máquinas van mucho más allá, hasta 128 GB. Sin embargo, incluso al modesto nivel del ordenador personal, esto no suele ser suficiente: es imposible almacenar todos los datos en la memoria. Por ejemplo, una película en formato DV de una videocámara digital ocupa casi 20 GB, un DVD completo más de 8 GB y así sucesivamente.
-
Aunque fuera posible...
Registros
Este capítulo se centra en los archivos de texto. En ellos, deberá definir la estructura de sus registros. Aunque todo es posible, sobre todo con estructuras de árbol como XML, inicialmente puede elegir entre dos métodos bastante sencillos: registros con delimitadores o registros de ancho fijo.
1. Delimitadores
Los registros delimitados son comunes en Unix. En cada línea, los valores individuales se denominan campos y están separados entre sí por un carácter especial llamado separador o carácter delimitador. Se puede utilizar cualquier carácter, pero no debe aparecer en el valor de un campo, ya que rompería la estructura del registro. A menudo se utilizan el punto y coma ";" o los dos puntos ":".
Los campos de registro suelen ir entre comillas cuando son cadenas de caracteres, nada para los valores numéricos. Esto no es una afirmación: no siempre es así y depende de usted gestionar el tipo de un valor determinado dentro de su programa.
He aquí un ejemplo sencillo del contenido de un archivo delimitado de tipo común en Unix:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:Daemon:/sbin:/bin/bash
lp:x:4:7:Printing daemon:/var/spool/lpd:/bin/bash
mail:x:8:12:Mailer daemon:/var/spool/clientmqueue:/bin/false
news:x:9:13:News system:/etc/news:/bin/bash
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
Los más perspicaces habrán reconocido una parte del archivo /etc/passwd que contiene información sobre las cuentas de usuario del sistema Unix. Cada línea es un registro con la siguiente estructura:
-
Un separador ":" delimita los distintos campos.
-
Hay siete campos, numerados (por convención) del 1 al 7.
-
1er campo: nombre de usuario (login).
-
2º campo: indicador de contraseña (aquí almacenada en otro lugar).
-
3er campo: UID, identificador numérico único del usuario.
-
4º campo: GID, identificador del grupo de usuarios (almacenado en otro lugar).
-
5º campo: comentario libre.
-
6º campo: carpeta personal del usuario.
-
7º campo: el intérprete de comandos (shell) de conexión.
Como puede ver, es posible incluir información muy importante en un archivo de texto.
Manejar un archivo de este tipo es bastante sencillo:...
Archivo de texto secuencial
1. Abrir y cerrar un archivo
Primero debe declarar el nombre lógico del archivo: una variable que, asociada al archivo, le permitirá trabajar con él. Como de costumbre, se coloca en la sección Var. A continuación, especifique el tipo de acceso: secuencial, directo, indexado, etc. Tenga en cuenta que, en acceso directo, también puede trabajar en modo secuencial.
VAR
fic:archivo secuencial
A continuación, hay que abrir el archivo, asociando nombre lógico y nombre de archivo, con el modo de apertura deseado. Esto se hace con la instrucción Abrir.
Abrir "toto.txt" en fic en modo lectura
También encontrará a veces esta sintaxis en forma de función, más próxima a ciertos lenguajes:
fic
Abrir("toto.txt","lectura")
La primera sintaxis suele ser preferible en los algoritmos. Para cerrar un archivo, utilice la sentencia Cerrar seguida del nombre lógico del archivo.
Cerrar fic
También existe una sintaxis funcional, pero se aplican las mismas observaciones: utilice la primera en caso de duda.
Cerrar(fic)
No incluya el nombre del archivo en las instrucciones de lectura, escritura y cierre. El programa no conoce el nombre del archivo, sólo su nombre lógico.
Así pues, el comienzo de un posible programa sería el siguiente:
Programa ABRIR
Var
fic :archivo secuencial
nombre :cadena
Inicio
nombre
"toto.txt"
Abrir nombre en fic en modo lectura
/* procesamiento */
Cerrar fic
Fin
2. Leer y escribir registros
a. Lectura
Como recordatorio, aquí los registros son las líneas de un archivo de texto, siendo un registro equivalente a una línea. Una línea se lee utilizando la instrucción Leer. Leer lee el registro en la posición actual del archivo y posteriormente, pasa al siguiente registro. Cuando se abre el archivo, Leer lee la primera línea. Uno nuevo Leer leerá la segunda y así sucesivamente hasta el final. Por eso la lectura se llama lectura secuencial. También encontrará la misma instrucción bajo el nombre LeerArchivo, es lo mismo.
La sintaxis es la siguiente:
Leer(nombre_logico,variable)
La variable del segundo...
Ejercicios
Ejercicio 1
Escriba un programa PHP para crear un archivo de texto si no existe ya y luego escriba "fecha y hora actuales:" seguido de la fecha actual en este archivo. En PHP, la fecha se muestra utilizando la función date(’d.m.Y G:i:s’)
Ejercicio 2
Escriba un programa PHP para crear un archivo de texto que almacene el número de veces que una página ha sido vista.
Ejercicio 3
Sean cliente.txt y prospecto.txt dos archivos cuyos registros tienen la misma estructura. Escriba un programa PHP que copie todo el contenido de los archivos cliente y prospecto en el archivo final.txt.