8 Archivos
Como hemos visto, los programas usan variables para guardar información: datos de entrada, resultados calculados, valores intermedios. Sin embargo, la información guardada en las variables es efímera. Cuando los programas paran de correr, el valor almacenado en las variables se pierde. En muchas ocasiones, es necesario guardar información de una forma más permanente.
En estos casos, el enfoque usual es recolectar la información en un todo lógicamente cohesivo y guardarlo en un medio permanente que generalmente se graba en el disco rígido de la máquina, es decir, en un archivo. Un archivo o fichero es un conjunto de información sobre un mismo tema tratado como una unidad de almacenamiento y organizado de forma estructurada para la búsqueda de un dato individual. Los archivos pueden contener instrucciones de programas o información creada o usada por un programa. Todos los objetos de datos permanentes que guardamos en nuestra computadora (documentos, juegos, programas ejecutables, código, etc.) son guardados en la forma de archivos.
La unidad elemental que compone a un archivo o fichero es un registro, el cual es una colección de información relativa a una misma entidad. En general, cada registro de un mismo archivo tiene la misma estructura que los demás. Los datos individuales sobre dicha entidad ocupan campos dentro de los registros. Por ejemplo:
ARCHIVO: Pasajeros
Campo 1: NOMBRE, tipo caracter
Campo 2: NÚMERO DE VUELO, tipo caracter
Campo 3: FECHA DE VUELO, tipo caracter
Campo 4: NÚMERO DE ASIENTO, tipo caracter
Campo 5: CIUDAD ORIGEN, tipo caracter
Campo 6: CIUDAD DESTINO, tipo caracter
Campo 7: PRECIO, tipo numérico
Nombre | NroVuelo | FechaVuelo | NroAsiento | Origen | Destino | Precio |
---|---|---|---|---|---|---|
Pamela Suárez | AR6071 | 12/09/17 | 17A | Rosario | Córdoba | 1532.23 |
Gonzalo Echarri | AR5423 | 14/09/17 | 31B | Rosario | Buenos Aires | 1424.10 |
… | … | … | … | … | … | … |
La forma más común de identificar un registro es eligiendo un campo dentro del registro llamado clave (por ejemplo, el nombre del pasajero), que contiene un único valor para cada registro. En otras casos es posible identificar un registro a través del valor de más de uno de sus campos.
8.1 Organización de archivos
Existen distintos tipos de organización de los archivos según la forma en la que se pueda acceder a cada uno de sus registros:
Archivo secuencial
Los registros se encuentran en cierto orden que debe ser respetado para la lectura de los mismos. Para leer el registro situado en la posición n, el programa previamente tiene que pasar por todos los registros que ocupan las posiciones anteriores. Los registros pueden leerse uno por uno hasta llegar al final del archivo. La mayoría de los lenguajes de programación disponen de una función lógica que devuelve un valor VERDADERO cuando se alcanza el final del archivo.
Archivo directo
Está formado por un conjunto de registros que pueden ser recuperados por su posición dentro del archivo sin necesidad de recorrer los anteriores.
Archivo indexado
Dispone de una tabla de índices adicional, es decir, una referencia que permite obtener de forma automática la ubicación de la zona del archivo donde se encuentra el registro buscado. Esto permite localizar un registro por medio de su clave, o del valor de algún campo en particular, sin recorrer previamente los registros que lo preceden.
La organización más sencilla y más comunmnete empleada es la secuencial, aunque no sea la más eficiente. Nosotros trabajaremos en el Taller con este tipo de organización.
8.2 Operaciones sobre archivos
Los procedimientos básicos que los programas pueden llevar a cabo sobre los distintos tipos de archivos son:
Creación de un archivo
Consiste en la escritura de los registros que van a conformar el archivo. Los datos pueden introducirse por teclado, desde otro archivo o como resultado de algún proceso intermedio.
Apertura y cierre de un archivo
Para que un programa pueda operar directamente sobre un archivo, la primera operación que debe realizar es la apertura del mismo, que incluye la identificación del archivo a utilizar y el modo (lectura, escritura, etc.). Cuando un programa no vaya a acceder más a un archivo, es necesario indicarlo a través del cierre del mismo, ya que se liberan memoria y recursos del sistema, se previene la corrupción de los datos si se detiene el programa mientras se está ejecutando y expresa explícitamente que ya no se hará más uso del mismo.
Lectura y escritura en un archivo
La lectura consiste en transferir información del archivo a la memoria principal usada por el programa, mientras que la escritura es la transferencia de información guardada en las variables del programa al archivo.
Otras operaciones que se pueden realizar sobre los archivos incluyen acciones de:
- Actualización: añadir (dar de alta), modificar o eliminar (dar de baja) algún registro.
- Clasificación: reubicar los registros de tal forma que queden ordenados por algún campo determinado.
- Fusión o mezcla: combinar dos o más archivos para formar uno nuevo.
- Partición: subdividir los registros por el valor que toman en algún campo.
8.3 Pseudo-código
Al escribir los algoritmos en pseudo-código, se puede hacer uso de las siguientes expresiones para representar algunas operaciones a realizar sobre los archivos:
ABRIR (nombre del archivo) secuencial, de entrada/salida
: indica la acción de apertura de un archivo con organización secuencial, sobre el cual se va a proceder a realizar lectura o escritura de registros.CERRAR (nombre del archivo)
: para indicar que el archivo no será vuelto a utilizar.LEER (nombre del archivo) campo1, campo2, ...
: indica la lectura del próximo registro cuando se trabaja con un archivo secuencial. La expresióncampo1, campo2, ...
son los nombres de los campos que contienen los registros y constituyen los identificadores de las variables que almacenarán temporalmente los datos del registro que se están leyendo.LEER (nombre del archivo, número de registro) campo1, campo2, ...
: indica la lectura de un registro en particular cuando se trabaja con un archivo de acceso directo.LEER (nombre del archivo, campo1 = valor) campo1, campo2, ...
: indica la lectura de cada uno de los registros en los cuales el campocampo1
es igual avalor
, para cuando se trabaja con un archivo de acceso indexado.- Las tres acciones de
LEER
anteriores tienen su acción análoga deESCRIBIR
, para modificar o añadir registros al archivo. FINDE (nombre del archivo)
: es la función lógica que devuelve el valorFALSO
mientras resten más registros por leer en el archivo y el valorVERDADERO
cuando se llega al final del archivo y ya no quedan más registros por leer.
8.3.1 Ejemplo: lectura de un archivo
Siendo nombreArchivo
el nombre del archivo que se desea leer, compuesto por m
campos llamados campo1
, campo2
, …, campom
, entonces, el pseudocódigo necesario para leer el archivo es:
ABRIR(nombreArchivo) secuencial, de entrada
MIENTRAS FINDE(nombreArchivo) = FALSO ENTONCES
LEER(nombreArchivo) campo1, campo2, ..., campom
... realizar operaciones con las variables campo1, campo2, ..., campom...
FIN MIENTRAS
CERRAR(nombreArchivo)
En IML, podemos seguir los siguientes pasos:
- Haciendo uso de un
proc import
, se importa el archivo en la librería temporalWork
(podría guardarse en otra), creando un dataset cuyo nombre se indica enout
(en este caso,nombreDataset
):
* Si se trata de un archivo de texto;
proc import out = nombreDataset
datafile = "C:\direccion\hasta\la\carpeta\nombreArchivo.txt"
dbms = TAB REPLACE;
run;
* Si se trata de un archivo de Excel;
proc import out = nombreDataset
datafile = "C:\direccion\hasta\la\carpeta\nombreArchivo.txt"
dbms = EXCEL REPLACE;
run;
- Dentro del
proc iml
, leer línea por línea los registros del data set que hemos creado (en este ejemplo,nombreDataset
) a través de undo data;
:
proc iml;
...
use nombreDataset;
do data;
* Se lee de a una línea (registro) por vez, los campos del archivo son usados como
variables que tienen los respectivos valores para la línea en cuestión;
... realizar operaciones con los valores de cada registro del archivo...
end;
close nombreDataset;
...
quit;
8.3.2 Ejemplo: escritura de un archivo
Supongamos que la información que se desea guardar en un nuevo archivo se encuentra en una matriz llamada tabla
, que tiene n
filas correspondientes a n
registros y m
columnas referidos a m
campos llamados campo1
, campo2
, …, campom
. Entonces, el pseudocódigo necesario para crear y escribir el nuevo archivo es:
CREAR(nombreArchivo)
ABRIR(nombreArchivo) secuencial, de salida
PARA i DESDE 1 HASTA n HACER
campo1 <- tabla[i, 1]
campo2 <- tabla[i, 2]
...
campom <- tabla[i, m]
ESCRIBIR(nombreArchivo) campo1, campo2, ..., campom
FIN PARA
CERRRAR(nombreArchivo)
En IML, a partir de la matriz que tiene la información que se desea guardar en un archivo, se deben seguir dos pasos:
- Dentro del mismo
proc iml
, crear un dataset de SAS a partir de la matriz. En este ejemplo, la matriz se llamatabla
, el nuevo datasetdatos
y se guarda en la librería temporalWork
(podría guardarse en otra):
proc iml;
... todo el código necesario ...
create datos from tabla[colname = ("campo1" || "campo2" || ... || "campom")];
append from tabla;
close datos;
quit;
- Haciendo uso de un
proc export
, se exporta el dataset desde la librería Work hasta una carpeta de la computadora, en este ejemplo, como archivo de texto:
proc export data = datos
outfile = "C:\direccion\hasta\la\carpeta\deseada\nombreArchivo.txt"
dbms = TAB REPLACE;
run;
8.4 Archivos de texto
Archivos como el del ejemplo de los pasajeros suelen ser guardados como archivos de texto. Un archivo de texto (también conocido como texto llano o texto simple), es un archivo informático que contiene únicamente texto formado por una secuencia ordenada de caracteres. El texto almacenado en este tipo de archivo carece de cualquier tipo de formato tipográfico (negrita, cursiva, colores, subrayado, fuente, etc.), lo cual permite que una gran variedad de programas pueda leer y editar el contenido.
Los archivos de texto están compuestos por caracteres ordinarios, como las letras, números y signos de puntuación, y por caracteres especiales que indican, por ejemplo, saltos de línea y tabulaciones. Como las computadoras solamente entienden números, cada caracter es codificado internamente con un representación numérica binaria. Distinas maneras de hacer esta representación dan lugar a diferentes formatos de codificación de caracteres (como ASCII, ISO-8859-1 o UTF-8).
La información contenida en los archivos que utilizaremos en el Taller puede ser almacenada de manera práctica en archivos de texto.