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.

Armarios de cintas magnéticas

 

Ejemplo de fichero secuencial (con Visual Basic)

Para entender como funcionaban los archivos de acceso secuencial, lo mejor es experimentarlo en nuestras carnes. Y para ello, vamos a crear un fichero secuencial, a leer y escribir datos en él.

Por simplicidad, para no tener que instalar ningún IDE de ningún lenguaje de programación, en las clases de Arquitectura de Datos, utilizamos VBA (Visual Basic Application) al que ya tenemos acceso en los ordenadores del aula, a través de Access del paquete de Microsoft Office Professional.

El ejercicio contempla 7 pasos:

Paso 1: Creamos una base de datos.

Creamos una base de datos nueva, le ponemos el nombre que queramos, por ejemplo: BBDD

Paso 2: Creamos un modulo nuevo

Vamos a la pestaña “HERRAMIENTAS DE BASE DE DATOS” , pulsamos en “Visual Basic”.

A continuación, en el menú Inserta/Modulo, creamos un nuevo módulo. En mi caso, lo dejo con el nombre por defecto: “Módulo1”, ya que sólo lo vamos a usar para practicar.

Paso 3: Programamos un procedimiento 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 procedimiento que realizaría esta tarea sería:

Sub RegistroEnArchivoSecuencial()

On Error GoTo e

ChDrive («D»)

ChDir «D:\pruebas»

‘Instrucción Open: https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/open-statement

Open «Proveedores.txt» For Output As #1

‘Registro de proveedores

Print #1, «Frutas Gutierrez»

Print #1, «Antonio Gutierrez»

Print #1, «607454545»

Print #1, «<FIN>»

Print #1, «Hortalizas del Sur»

Print #1, «Guillermo Morales»

Print #1, «652854874»

Print #1, «<FIN>»

Print #1, «Azucarera Sevillana»

Print #1, «Rodrigo Mendez»

Print #1, «622525885»

Print #1, «<FIN>»

 ‘Cerrar el archivo:

Close #1

MsgBox («Guardados 3 registros de proveedores»)

Exit Sub

e:

MsgBox (Err.Description)

End Sub

Sin explicar en profundidad como funciona el procedimiento, ya que este no es un curso de programación, sencillamente comentar que el procedimiento crea un fichero en la ruta especificada y luego vamos escribiendo los datos en él, de manera secuencial.

Vemos que tenemos que seguir un orden para los campos y acabar cada registro con la marca de sincronismo “<FIN>”.

Paso 4: Ejecutamos el procedimiento

Desde la ventana de Inmediato, ejecutamos el procedimiento.

Observamos el resulto, en la ruta indicada se ha generado el fichero Proveedores.txt. Si abrimos el fichero veremos como se han cargado los datos de forma secuencial.

Datos del fichero proveedores

Paso 5: Programamos un procedimiento para la lectura de los datos

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

Sub Leyendo()

 On Error GoTo e

 ChDrive («D»)

ChDir «D:\pruebas»

 Dim linea As String

Dim MyChar As String

Dim PintarLinea As Boolean

 ‘Instrucción Open: https://docs.microsoft.com/es-es/office/vba/language/reference/user-interface-help/open-statement

Open «Proveedores.txt» For Input As #1

 ‘Variable cadena donde guardo la linea que leo

linea = «»

‘Variable booleana para saber si hay que pintar o no la línea.

‘La línea se va construyendo carácter a carácter. Hago PintarLinea verdadero cuando llego a un final de línea

PintarLinea = False

 ‘ Bucle hasta llegar al final del fichero

Do While Not EOF(1)

    MyChar = Input(1, #1)

    If MyChar = Chr(13) Then

        PintarLinea = True

    ElseIf (MyChar <> Chr(10)) Then

        linea = linea + MyChar

    Else

    End If

    If PintarLinea Then

        Debug.Print linea

        linea = «»

        PintarLinea = False

    End If

Loop

Close #1

 Exit Sub

e:

MsgBox (Err.Description)

 End Sub

Si ejecutamos el procedimiento en la pantalla de Inmediato, veremos que se nos imprimen en pantalla todos los datos del fichero. Los hemos ido leyendo carácter a carácter de forma secuencial, y dibujando en pantalla cada línea del fichero.

Paso 6: Programamos un procedimiento para buscar un registro, para recuperar los datos de un proveedor

Llamo al procedimiento BuscandoProveedor, y su código sería:

Sub BuscandoProveedor()

 ChDrive («D»)

ChDir «D:\pruebas»

 Dim linea, MyChar, proveedor As String

Dim PintarLinea, encontrado As Boolean

Dim numCamposPintados As Integer

‘guardo en la variable proveedor el nombre del proveedor que introduce el usuario

proveedor = InputBox(«Introduce el nombre del proveedor que quieres buscar», «Busqueda»)

 Open «Proveedores.txt» For Input As #1

 linea = «»

PintarLinea = False

encontrado = False

numCamposPintados = 0

‘Recorro todo el fichero caracter a caracter hasta la marca final de fichero EOF

Do While Not EOF(1)

    MyChar = Input(1, #1)

    If MyChar = Chr(13) Then

        PintarLinea = True

    ElseIf (MyChar <> Chr(10)) Then

        linea = linea + MyChar

    Else

    End If

    ‘Comprobación para ver si he encontrado al proveedor

    If linea = proveedor Then

        encontrado = True

    End If

    ‘Si tengo una linea completa para pintar, PintarLinea es true

    ‘Si he encontrado el proveedor, encontrado es true

    ‘Una vez encontrado, pinto la linea leida y las dos siguientes. El registro tiene tres campos, tres lineas.

    If PintarLinea Then

        If encontrado Then

            Debug.Print linea

            numCamposPintados = numCamposPintados + 1

        End If

        If numCamposPintados = 3 Then

            encontrado = False

        End If

        linea = «»

        PintarLinea = False

    End If

Loop

 Close #1

 ‘Si no encontramos el proveedor que buscaba el usuario, lo indico con un mensaje

If numCamposPintados = 0 Then

    MsgBox «Proveedor no encontrado»

End If

 End Sub

Si lo ejecutamos, veremos que nos aparece un cuadro de dialogo para que introduzcamos el nombre del proveedor que vamos a buscar.

El funcionamiento es similar al anterior procedimiento en el que leíamos las líneas del fichero, sólo que en este caso voy comparando las líneas leídas con el nombre del proveedor introducido por el usuario, y en el caso de que coincidan, escribo en pantalla esa línea y las dos siguientes, ya que el registro completo del proveedor tiene tres campos.

Si por ejemplo buscamos el proveedor: Azucarera Sevillana, el resultado sería:

Paso 7: Forzando un error

Como ya he comentado, la estructura de los ficheros secuenciales es muy estricta, muy fija. En este ejemplo, si nos equivocáramos e introdujéramos “Rodrigo Mendez” como proveedor,  en lugar de “Azucarera Sevillana”, obtendríamos los campos siguientes, típico del acceso secuencial, no estaríamos obteniendo el registro completo:

Tras completar los 7 pasos de este ejercicio, estoy seguro de que te has hecho una idea del funcionamiento de los archivos de acceso secuencial, pero esto fue la primera solución para digitalización de datos, cuyas limitaciones fueron superadas por los archivos de acceso aleatorio, pero esto será tema para otro post.

NOTA:

Este post es parte de la colección “Arquitectura de Datos” que reproduce los apuntes de la clase que imparto sobre el tema en ESIC. Puedes ver el índice de esta colección aquí.