Archivos de acceso secuencial

La primera opción de almacenamiento digital que se empleo fueron los archivos de acceso secuencial, ficheros con una cierta estructura para almacenar los datos pero muy lejos todavía de las bases de datos.

Pongámonos al inicio de la segunda mitad del siglo XX, cuando nuestro protagonista Antonio comienza a pasar a formato digital los datos de su tienda SuperGades. La opción que por entonces tiene disponible es sencillamente pasar los datos de un fichero en papel a un fichero digital, empleando un procesador de textos muy sencillo con muy pocas funcionalidades, en el que escribiríamos los datos sin ningún tipo de formato. A este fichero, se le denomina también archivo, tomando el nombre de su antecedente analógico, un fichero físico con cajones donde guardábamos las fichas con los datos. Si estuviéramos almacenando los datos de los proveedores, el archivo podría tener un aspecto similar a:

Frutas Gutierrez
Antonio Gutierrez
607454545
Hortalizas del Sur
Guillermo Morales
652854874
Azucarera Sevillana
Rodrigo Mendez
622525885

En este archivo hemos escrito los datos de nuestros proveedores uno detrás de otro, como lo haríamos en un cuaderno. Hemos generado un archivo secuencial, que recibe este nombre porque los datos se almacenan uno detrás de otro, y el acceso a los mismos será de forma secuencial, es decir, tengo que recorrer el archivo desde el principio hasta llegar al dato que quiero recuperar.

La marca EOF (End of File)

Esta manera de trabajar obligaba a incluir algún tipo de marca que nos indicara que habíamos llegado al final del archivo, de otro modo, obtendríamos un error al intentar leer un dato más allá del final del archivo. Esta marca es el carácter de final de archivo EOF.

Cuando escribíamos datos en el archivo, al cerrar el mismo, se añadía de manera automática este carácter al final del archivo.

Los lenguajes de programación emplean el carácter EOF en los procesos de lectura de datos. Van recorriendo el archivo de forma secuencial, línea a línea, dentro de un bucle hasta leer la marca EOF.

Limitaciones de los archivos secuenciales

El uso de archivos secuenciales para el manejo de datos presenta muchas limitaciones:

Acceso secuencial: como ya he mencionado antes, el acceso a los datos era secuencial, teníamos que recorrer todo el fichero desde su primera línea hasta llegar al dato que queríamos recuperar. Esta era la única manera de movernos por el archivo, siempre se avanzaba a leer la línea siguiente, no se podía retroceder, si queríamos recuperar un dato que ya habíamos pasado, teníamos que comenzar la lectura secuencial desde la primera línea.

Modos de apertura: Al acceder al fichero para trabajar con él, lo tenemos que abrir en modo de escritura o lectura, dependiendo de la operación que queramos realizar. Para cambiar de operación tenemos que cerrar el fichero y abrirlo de nuevo en el modo correspondiente.

Las lecturas pueden ser parciales, sin embargo las escrituras tienen que se completas. Cuando abrimos un fichero secuencial en modo escritura estamos borrando todo su contenido anterior. Por ejemplo, cuando queremos borrar un registro, lo que hacemos es reescribir el fichero completo, salvo el registro que queremos eliminar.

Algunos lenguajes de programación, permiten escribir a continuación del final de fichero. Un comando muy habitual para realizar esta función es Append.

Acceso exclusivo: Solamente un usuario puede trabajar sobre el fichero en un determinado momento, para que un nuevo usuario pueda acceder al fichero, el usuario actual tendría que cerrarlo antes. En otras palabras, no es posible que varios usuarios accedan al fichero de manera simultanea.

Estructura fija de campos: El propio funcionamiento de este tipo de archivos, nos obliga a manejar una estructura fija de datos. En el archivo ejemplo de proveedores primero guardábamos el nombre de la empresa, luego el nombre de la persona de contacto y finalmente el número de teléfono.

Cuando recorremos el fichero, sencillamente leemos datos, pero no sabemos que dato estamos leyendo. De esta forma, si cambiáramos accidentalmente el orden de registro, por ejemplo colocando primero el contacto y luego el nombre de la empresa, el dato de contacto sería tomado como el nombre de la empresa y el dato del nombre de la empresa como contacto.

Campos y registros

La estructura de almacenamiento de datos, la podemos definir en campos y registros. Un campo sería un tipo de dato y un registro sería el conjunto de campos que definen un elemento. Siguiendo con el ejemplo del archivo de proveedores, los campos de nuestra estructura serían: nombre del proveedor, contacto en el proveedor y teléfono. Y un registro sería el conjunto de campos que definen un elemento, en nuestro caso, un proveedor.

Pues bien, nuestro amigo Antonio, para evitar errores con los datos, decide realizar algunas mejoras en sus archivos secuenciales. Básicamente, introduce una marca de sincronismo, que nos indica el final de un registro. Esta marca puede ser cualquiera que definamos, pero una comúnmente empleada era <FIN>.

Con esta mejora, el archivo de proveedores quedaría:

Frutas Gutierrez
Antonio Gutierrez
607454545
<FIN>
Hortalizas del Sur
Guillermo Morales
652854874
<FIN>
Azucarera Sevillana
Rodrigo Mendez
622525885
<FIN>

Lógicamente, esta marca no podía ser nunca el valor de un campo, ya que nos conduciría a error, interpretaríamos dicho campo como el final del registro.

Soporte físico

En aquellos tiempos, Antonio emplearía cintas magnéticas para almacenar sus datos. Una cinta que se enrollaba sobre un rodillo, y que contenía partículas magnéticas para almacenar los datos. La cinta se iba desenrollando y se hacia pasar por un cabezal para su lectura o escritura, el mismo sistema empleado para las famosas cassettes de música. El propio funcionamiento de este sistema forzaba a que el acceso fuera secuencial, recorriendo la cinta de principio a fin.

Sistema de almacenamiento en cintas magnéticas
Sistema de almacenamiento en cintas magnéticas

Ejercicio: Practicar las operaciones de registro y lectura de datos en archivos secuenciales

En cualquier caso, para entender cómo funcionaba este sistema, lo mejor es experimentarlo en nuestras carnes. Para ello, vamos a crear un fichero secuencial, a leer y escribir datos en él.

Este ejercicio lo realizaremos con python.

Paso 1: Programamos un script para registro de datos

Lo primero que haremos será crear un archivo con los datos. Por ejemplo, con los datos de proveedores que manejaba Antonio. El script que realizaría esta tarea sería:

Sin explicar en profundidad cómo funciona el programa, ya que este no es un curso de programación, sencillamente comentar que este crea el fichero de texto: “registros.txt” y luego escribimos los datos en él, de manera secuencial.

Paso 2: Ejecutamos el programa

Al ejecutar el programa, se nos crea el fichero “registros.txt” en la carpeta en la que este el programa.

Si abrimos ahora el fichero con el bloc de notas, obtenemos:

Fichero de proveedores
Fichero de proveedores

Hemos guardado los datos registrando un campo en cada línea. Como cada registro está compuesto de tres campos: Proveedor, Contacto y Teléfono, para recuperar un registro completo tendremos que leer tres líneas consecutivas.

Paso 3: Programamos un método para leer los datos del fichero

En mi caso lo llamo leer archivo y tendría el siguiente aspecto:

Si ejecutamos el método, veremos que se nos imprimen en pantalla todos los datos del fichero. Para ejecutar el método tecleamos:

Hemos ido leyendo los datos línea a línea de forma secuencial, y dibujando en pantalla cada línea del fichero. El resultado que obtenemos es:

Leyendo datos del archivo:
Frutas Gutierrez
Antonio Gutierrez
607454545
Hortalizas del Sur
Guillermo Morales
625854874
Azucarera Sevillana
Rodrigo Mendez
622525885

Paso 4: Programamos un método para buscar un registro, para recuperar los datos de un proveedor

Lo normal será que queramos recuperar los datos de un único proveedor, buscando por el nombre o por el contacto. Buscando por este último término, un posible método que realizaría esta función sería:

Si ejecutamos este método pasándole como nombre: “Antonio Gutierrez”:

Obtendríamos el resultado:

Registro encontrado para Antonio Gutierrez: ['Frutas Gutierrez', 'Antonio Gutierrez', '607454545']

El método lee el fichero línea a línea, y cuando encuentra el dato que buscamos, almacena en una lista la línea anterior, la línea encontrada y la siguiente, es decir, todo el registro.

Paso 5: Usando el formato csv

Hoy en día, el formato más habitual para este tipo de ficheros es el csv (fichero separado por comas). Vamos a repetir todo el proceso de trabajo pero empleando un fichero de este tipo.

Empezamos generando el fichero con el script:

Llamamos al método para crear el fichero

Si abrimos ahora el fichero con el bloc de notas, obtenemos:

Fichero de proveedores en formato csv
Fichero de proveedores en formato csv

Hemos definido una primera fila que contendría los títulos o los nombres de los campos, lo que es una practica habitual en los ficheros csv. En este formato, los distintos campos se separan por comas y cada registro va en una línea.

Realizamos ahora un método para leer el archivo:

Si ejecutamos ahora:

El resultado será:

Ya sólo nos quedaría recuperar un registro que busquemos por un nombre, para ello podemos emplear el siguiente método:

Si ejecutamos este método pasándole como nombre: “Guillermo Morales”:

Obtenemos:

Registro encontrado para Guillermo Morales: Hortalizas del Sur,Guillermo Morales,625854874

NOTA:

Este post es parte de la colección “Sistemas de acceso y almacenamiento de datos”. Puedes ver el índice de esta colección aquí.