Anda di halaman 1dari 12

Ing.

Cristina González Córdova

TC1017 Solución de Problemas con Programación


Tutorial Manejo de Archivos de Texto en Scilab

Objetivo
Aprender a construir aplicaciones que hagan uso de archivos de texto.

Tiempo estimado: 90 minutos

Descripción
Scilab nos permite trabajar con archivos de texto para leer o escribir datos en ellos. Estos tipos de archivos (junto con los
archivos de Excel) proveen fuentes de datos para obtener grandes cantidades de información. Con esta información
podemos fácilmente llenar matrices, generar cálculos, crear gráficas, etc.

Indicaciones
Dentro de este tutorial vamos a ver 2 formas de trabajar con archivos de texto. El objetivo es conocer ambas
modalidades, sus características, ventajas y desventajas, para poder seleccionar la que mejor se adapte al momento de
trabajar con archivos de texto.

MODALIDAD 1
Este tipo de acceso a archivos de texto es ideal cuando trabajamos con datos que serán introducidos en matrices. Se
recomienda más esta modalidad cuando los datos leídos del archivo son todos numéricos o todos textos de una sola
palabra, puesto que utiliza los espacios para separar lo datos.

En este tipo de acceso, debemos realizar SIEMPRE 3 pasos básicos:

1. Abrir el archivo
2. Leer/Escribir en el archivo
3. Cerrar el archivo

Leer archivo
Para leer datos de un archivo de texto, primeramente debemos tener generado un archivo de texto en la computadora.
Este archivo ‘plano’ puede ser generado en un editor como Notepad o similar. Para trabajar en este tutorial debemos
generar un archivo así:

Nota Importante: El archivo debe tener un formato plano, es decir, un archivo Word o Excel no se puede manejar en esta
modalidad. Para mayor referencia: http://es.wikipedia.org/wiki/Archivo_de_texto
Ing. Cristina González Córdova
El cual grabamos y nombramos como: Ejemplo1.txt Colocamos dicho archivo en la ruta: C:/Scilab/ (Si no existe la ruta,
generarla).

Teniendo este archivo, vamos a definir el código necesario (puede ser dentro de una función) para realizar los 3 pasos
básicos:

1. Abrir el archivo: Utilizamos la instrucción “file” que debe recibir 3 parámetros: file('open',pathArchivo,estatus).
En nuestro caso sería:

u = file('open','C:/Scilab/Ejemplo1.txt','old')

El estatus básico que manejamos para abrir un archivo es:

'old' → Para accesar archivos existentes

La representación del archivo se mantendrá en la variable a la cual asignamos la instrucción, en este caso la
nombramos como “u”. De aquí en adelante utilizaremos esta variable para referirnos al archivo, tanto como
para leer como para cerrarlo.

2. Leer el archivo: Utilizamos la instrucción “read” que debe recibir el archivo que acabamos de abrir, el número de
renglones a leer y el número de columnas: read(file,rows,cols). Esto lo asignamos a una variable en la que se
cargarán los datos leídos del archivo (como una matriz). En nuestro caso sería:

M1 = read(u,3,5)

Lo que estamos diciendo es que lea del archivo “u”, los primeros 3 renglones y las primeras 5 columnas (las
columnas son definidas dependiendo los espacios que encuentre). Estos datos serán almacenados en la variable
(matriz) “M1”.

NOTA: En caso de que queramos que se lean todos los renglones, podemos utilizar el valor -1 en el segundo
parámetro, lo cual significa “todos los renglones”. No podemos hacer lo mismo con las columnas, ahí si hay
que especificar explícitamente el número.

3. Cerrar el archivo: Cuando terminamos de trabajar con el archivo, debemos cerrarlo. También se utiliza la
instrucción “file” pero con el parámetro 'close': file('close',archivo). Y sería:

file('close',u)

Después de haber leídos los datos del archivo, podemos realizar las operaciones necesarias con los datos que ya se
encuentran disponibles en la matriz M1.

Una función completa implementando estos pasos sería:

function leeArchivo()

u = file('open','C:/Scilab/Ejemplo1.txt','old') // Abre archivo


M1 = read(u,-1,5) //Lee todos los renglones y 5 columnas y los guarda en la matriz M1
file('close',u) //Cierra el archivo
disp(M1) // Despliega los datos leídos del archivo

endfunction
Ing. Cristina González Córdova
Escribir archivo
Para escribir datos hacia un nuevo archivo de texto, primeramente debemos tener en una matriz los datos que
deseamos introducir en nuestro archivo. Por ejemplo:

A = [1,2,3; 4,5,6; 7,8,9;10,11,12]

Nota Importante: El archivo que vamos a generar, NO DEBE existir, de lo contrario Scilab marcará un error.

Teniendo estos datos definidos, vamos a escribir el código para realizar los 3 pasos básicos:

1. Abrir el archivo: Utilizamos la instrucción “file” que debe recibir 3 parámetros: file('open',pathArchivo,estatus).
En nuestro caso sería:

u = file('open','C:/Scilab/EjemploWrite1.txt','new')

El estatus básicos que manejamos para crear un archivo nuevo es:

'new' → Para crear un archivos nuevo. No debe existir dicho archivo.

La representación del nuevo archivo se mantendrá en la variable a la cual asignemos la instrucción, en este caso
la nombramos como “u”. De aquí en adelante utilizaremos esta variable para referirnos al archivo, tanto como
para escribir como para cerrarlo. En este punto Scilab generará el archivo nuevo vacío, listo para introducir datos
en él.

2. Escribir datos al archivo: Utilizamos la instrucción “write” que debe recibir el archivo que acabamos de abrir, el
valor o variable donde se encuentran los valores, y el formato que se utilizará para acomodar dichos datos
dentro del archivo: write(file,valor,formato). En nuestro caso sería:

write(u,A,'(3(i,2x))')

Lo que estamos diciendo es que escriba dentro del archivo u los datos contenidos en la matriz A, con el formato
'(3(i,2x))' que significa: “Ordenado en 3 columnas (3), números enteros (i) y separando con 2 espacios entre cada
columna (2x)”

NOTA: El formato utilizado no es nativo de Scilab, sino que es utilizado el formato “Fortran”. Este string que
define el formato debe empezar con un paréntesis y terminar con otro paréntesis y no puede mezclar formatos
enteros (i), con punto decimal (f) o texto (a)

Los conceptos básicos del formato son:

 Primer número después de primer paréntesis: Significa el número de renglones a escribir.


 Elemento dentro del segundo paréntesis con tipo de dato: indica el tipo de dato a escribir, por ejemplo
i = entero, f = valor fraccionario, a = texto
 Elemento dentro del paréntesis acompañado por x: indica el número de espacios entre columnas, y
siempre va acompañado con una x

Ver Anexo A para mayor información de la estructura de estos formatos.

3. Cerrar el archivo: Cuando terminamos de trabajar (escribir) con el archivo, debemos cerrarlo. También se utiliza
la instrucción “file” pero con el parámetro 'close': file('close',archivo). Y sería:
Ing. Cristina González Córdova
file('close',u)

Después de haber escrito datos en el archivo, podemos hacer otras tareas, pero es de suma importancia haber cerrado
correctamente el archivo. El archivo generado sería el siguiente:

Una función completa implementando estos pasos sería:

function escribeArchivo()

A = [1,2,3; 4,5,6; 7,8,9;10,11,12] // Se crea la matriz con los datos a escribir


u = file('open','C:/Scilab/EjemploWrite1.txt','new') // Se abre/crea el archivo nuevo
write(u,A,'(3(i,2x))') // Se escriben los datos: 3 columnas, número enteros, 2 espacios
file('close',u) //Cierra el archivo

endfunction
Ing. Cristina González Córdova
MODALIDAD 2
Existe otra forma de trabajar con archivos de texto dentro de Scilab. Utilizando los comandos mopen, mfscanf, mfprintf
y mclose podemos acceder a los datos de archivos de texto, así como generar/escribir datos en ellos. Se recomienda
más esta modalidad cuando los datos que vamos a leer o a escribir están ordenados en renglones donde cada renglón
representa un dato, de manera que podemos trabajar con cada renglón obteniendo/escribiendo distintos tipos de datos.
En esta modalidad es más fácil manejar textos y leer distintos tipos de datos por renglón. Hay que leer y escribir renglón
por renglón por lo que es un proceso mas lento y laborioso pero más robusto. Para su lectura o escritura es muy común
utilizar estructuras cíclicas.

En este tipo de acceso, debemos realizar SIEMPRE 3 pasos básicos:

1. Abrir el archivo
2. Leer/Escribir en el archivo
3. Cerrar el archivo

Leer archivo
Para leer datos de un archivo de texto, primeramente debemos tener generado un archivo de texto. Para este tutorial
debemos generar un archivo de texto que contenga los siguientes valores:

Nota Importante: El archivo debe tener un formato plano, es decir, un archivo Word o Excel no se puede manejar en esta
modalidad. Para mayor referencia: http://es.wikipedia.org/wiki/Archivo_de_texto

El cual grabamos y nombramos como: Ejemplo2.txt Colocamos dicho archivo en la ruta: 'C:/Scilab/ (Si no existe la ruta
hay que crearla)

Teniendo este archivo, vamos a definir el código necesario (puede ser dentro de una función) para realizar los 3 pasos
básicos:

1. Abrir el archivo: Utilizamos la instrucción “mopen” que debe recibir 2 parámetros: mopen(pathArchivo,modo).
En nuestro caso sería:

u = mopen(“C:/Scilab/Ejemplo2.txt”,”r”)

El modo de apertura que manejamos para abrir un archivo es:

“r” → Para accesar archivos existentes


Ing. Cristina González Córdova
La representación del archivo se mantendrá en la variable a la cual asignemos la instrucción, en este caso la
nombramos como “u”. De aquí en adelante utilizaremos esta variable para referirnos al archivo, tanto como
para leer como para cerrarlo.

2. Leer el archivo: La lectura del archivo se irá haciendo renglón por renglón. Para leer el siguiente renglón
disponible utilizamos la instrucción “mfscanf” que debe recibir el archivo que estamos utilizando u, y el formato
de los valores que vamos a sacar del RENGLÓN: mfscanf(file,formatoValores). Esta instrucción nos regresa varios
parámetros de salida. En primera instancia el número de datos leídos y después los datos solicitados. En nuestro
caso sería:

[numRegistros, nombre, apellido, edad] = mfscanf(u, "%s %s %i")

Lo que estamos diciendo es que lea del archivo “u”, el siguiente renglón. Estamos pidiendo 3 datos: los primeros
2 datos (columnas) lo leeremos como texto y el tercer dato (columna) como un número entero. Los parámetros
de salida que obtenemos corresponden primeramente al número de datos leídos (numRegistros). En el
parámetro nombre tendremos la primera columna leída (texto), en el parámetro apellido la segunda columna
leída (texto) y en el parámetro edad tendremos la tercera columna leída (número entero).

NOTA: Cada vez que ejecutamos la instrucción mfscanf se leerá el renglón actual y se pasará al siguiente
automáticamente. Cuando el número de registros leídos (en este caso numRegistros) sea igual a 0 significa
que ha llegado al final de la lista y es una forma de saber cuando dejar de leer renglones. Si queremos
regresar al principio del archivo se debe cerrar y volver a abrirlo.

Los formatos que se utilizan para leer las columnas son los siguientes:

◦ %i = número entero

◦ %f = número fraccionario

◦ %s = texto

3. Cerrar el archivo: Cuando terminamos de trabajar con el archivo, debemos cerrarlo. Para realizar esta acción
utilizamos la instrucción “mclose” con el parámetro del archivo con el que estamos trabajando: mclose(archivo).
Y sería:

mclose(u)

Después de haber leídos los datos de un reglón, podemos utilizar estos para generar cálculos, gráficas o meterlos dentro
de una matriz o vector. Si queremos leer todos los renglones del archivo podemos meter nuestra instrucción dentro de
un ciclo, por ejemplo:

while (%t)
[num, nombre, apellido, edad] = mfscanf(u, "%s %s %i")
if (num <= 0)
break
end
end
Ing. Cristina González Córdova
Una función completa implementando estos pasos sería:

function leeArchivo2()

u = mopen("C:/Scilab/Ejemplo2.txt","r") // Abre archivo


num = 1 // variable para leer numero de elementos
while (num > 0) // Inicia el ciclo para leer renglón por renglón
//Lee 3 columnas renglón por renglón
[num, nombre, apellido, edad] = mfscanf(u, "%s %s %i")
if (num > 0) // verifica si leyó datos
//Despliega los datos leídos
disp("Nombre: " + nombre + " - Apellido: " + apellido + " Edad: " + string(edad))
end // end del if
end // end del while
mclose(u) // cierra archivo

endfunction

Escribir archivo
Para escribir datos hacia un nuevo archivo de texto, primeramente debemos tener los datos que deseamos introducir en
nuestro archivo. Por ejemplo, digamos que queremos escribir los datos de 2 vectores, los definimos así:

v1 = [1:10]

v2 = v1^2

Nota Importante: El archivo que vamos a generar, NO DEBE existir, de lo contrario Scilab marcará un error.

Teniendo estos datos, vamos a definir el código para realizar los 3 pasos básicos:

1. Abrir el archivo: Utilizamos la instrucción “mopen” que debe recibir 2 parámetros: mopen(pathArchivo,modo).
En nuestro caso sería:

u = mopen(“C:/Scilab/EjemploWrite2.txt”,”w”)

El modo que manejamos para crear un archivo nuevo es:

“w” → Para crear un archivos nuevo. No debe existir dicho archivo.

La representación del nuevo archivo se mantendrá en la variable a la cual asignemos la instrucción, en este caso
la nombramos como “u”. De aquí en adelante utilizaremos esta variable para referirnos al archivo, tanto como
para escribir como para cerrarlo. En este punto Scilab generará el archivo nuevo vacío, listo para introducir datos
en él.

2. Escribir datos al archivo: Utilizamos la instrucción “mfprintf” que debe recibir el archivo que acabamos de
abrir/crear, el formato que se utilizará para escribir y los valores a introducir:
mfprintf(file,formatoValores,valores…). En nuestro caso, para escribir el primer valor de cada vector sería:
Ing. Cristina González Córdova
mfprintf(u, "%i al cuadrado es: %i \n", v1(1),v2(1))

Lo que estamos diciendo es que escriba dentro del archivo u el texto mencionado, el cual llevará 2 valores,
ambos enteros (%i), posteriormente le indicamos de donde sacará esos valores para sustituirlos (el primer valor
será v1(1) y el segundo valor será v2(1)). Al final, agregamos el comando “\n” el cual significa que queremos un
salto de línea. Cada vez que utilizamos la instrucción mfprintf se escribirá exactamente donde se quedó la última
vez, por lo que es importante recordar el uso del salto de línea (\n)

NOTA: Dentro del string donde definimos el formato y texto a escribir se especifican comandos que
determinan valores que asignaremos en la sección de valores a escribir, es IMPORTANTE tomar en cuenta que
el número de valores que definamos en este string debe corresponder en número y tipo a la lista de variables
subsecuentes, de lo contrario Scilab marcará un error.

Los formatos que se utilizan para definir valores a remplazar son:

◦ %i = número entero

◦ %f = número fraccionario

◦ %s = texto

4. Cerrar el archivo: Cuando terminamos de trabajar (escribir) con el archivo, debemos cerrarlo. Para realizar esto
utilizamos la instrucción “mclose” con el parámetro del archivo con el que estamos trabajando: mclose(archivo).
Y sería:

mclose(u)

Después de haber escrito datos en el archivo, podemos hacer otras tareas, pero es de suma importancia haber cerrado
correctamente el archivo. El archivo generado será el siguiente (se encuentra en la ruta y con el nombre especificados
cuando abrimos/creamos el archivo):

Una función completa implementando estos pasos sería:

function escribeArchivo2()
v1 = [1:10] //Definimos primer vector
v2 = v1^2 //Definimos segundo vector
u = mopen("C:/Scilab/EjemploWrite2.txt","w") //Creamos el nuevo archivo
for i = 1:10 //Generamos un ciclo de 10 elementos
mfprintf(u, "%i al cuadrado es: %i \n", v1(i),v2(i)) //Escribimos cada renglón
end //end del for
mclose(u) //Cerramos el archivo
endfunction
Ing. Cristina González Córdova
Anexo A
Descriptores de formato Fortran

Hay 4 categorías básicas de descriptores de formato:

 Los que describen la posición vertical de la línea de texto.


 Los que describen la posición horizontal de los datos en una línea.
 Los que describen el formato de entrada/salida de un valor particular.
 Los que controlan la repetición de descriptores o grupos de descriptores de formato.

La siguiente tabla contiene una lista de símbolos usados con los descriptores de formatos más comunes:

Tabla 1. Descriptores de formatos

Descriptor I de formato entero

Sintaxis general para salida de datos enteros:

[r]Iw[.m]

Los símbolos usados tienen el significado que se muestra en la Tabla 1. El valor se ajusta a la derecha del campo. Si el
valor es demasiado grande para mostrarse con w caracteres, se muestran w asteriscos.

Ejemplos de salida:
Ing. Cristina González Córdova

Tabla 2. Ejemplos de salida formato entero

Descriptor F de formato real

Sintaxis general para salida de datos reales:

[r]Fw.d

Los símbolos usados tienen el significado que se muestra en la Tabla 1. Para salida, el valor se ajusta a la derecha del
campo. Si d es menor que el número de dígitos decimales del número, el valor se redondea. Si d es mayor que el número
de dígitos decimales del número, se añaden ceros hasta completarlo. Si el valor es demasiado grande para escribirse con
w caracteres, el campo w se llena de asteriscos.

Para evitar mal interpretaciones, es conveniente incluir siempre un punto decimal en cualquier valor real usado en una
sentencia de lectura con formato.

Ejemplos de salida:

Tabla 3. Ejemplos de salida formato real


Ing. Cristina González Córdova

Descriptor E de formato exponencial

La notación científica es muy usada por científicos e ingenieros para representar números muy grandes o muy
pequeños. En esta notación, los números se normalizan al rango de valores entre 1.0 y 10.0 y se representan, por un
número entre 1.0 y 10.0 multiplicado por una potencia de diez. Por ejemplo: el número de Avogadro en notación
científica es 6.023x1023.

El formato exponencial no se corresponde exactamente con la notación científica, pues los números se normalizan al
rango de valores entre 0.1 y 1.0. En el ejemplo anterior, el número de Avogadro se representa en formato exponencial
por 0.6023E+24.

La sintaxis general para entrada/salida de datos reales con formato exponencial es:

[r]Ew.d

Los símbolos usados tienen el significado que se muestra en la Tabla 1.

Los mismos criterios que operan sobre un dato real con formato F se aplican a ese dato real con formato exponencial. Si
un número se quiere escribir en formato exponencial con d cifras decimales, la anchura de campo mínima w ≥ d+7, pues
tal número se representa ±0.ddddE±ee y requiere como mínimo un carácter para representar el signo (sólo si es
negativo), otro para la parte entera del número, el punto decimal, el carácter E, el signo del exponente y los dos dígitos
del mismo.

Ejemplos de salida:

Tabla 4. Ejemplos de salida formato exponencial

Descriptor A de formato caracter

Sintaxis general para salida de datos carácter:

[r]A[w]

Si w no aparece, el descriptor A escribe el dato carácter en una anchura igual a la longitud de la variable caracter. Si w
aparece, el descriptor A escribe el dato carácter en una anchura fija a w.
Ing. Cristina González Córdova
Si w>longitud de la variable caracter:
 para salida, la cadena se ajusta a la derecha del campo y,
 para entrada, el dato del fragmento derecho del campo se lee en la variable caracter.

Si w<longitud de la variable caracter:


 para salida, sólo se escriben los primeros w caracteres de la cadena y,
 para entrada, sólo los primeros w caracteres de la cadena se ajustan a la izquierda de la variable caracter
y el resto se llena con blancos.

Ejemplos de salida:

Tabla 5. Ejemplos de salida formato carácter

Descriptores X, T de posición horizontal y / de posición vertical

Los descriptores X y T se usan para controlar el espacio horizontal y el descriptor slash / para controlar el espacio
vertical. La sintaxis general de cada uno de ellos es:

nX  Para salida suele emplearse para espaciar los datos. El descriptor nX salta n espacios en la línea actual.

Tc  Salta directamente a la columna número c de la línea actual. Funciona como un tabulador más general,
pues puede saltar hacia derecha o izquierda. Para salida suele emplearse para espaciar los datos.

/[/][…]  Este es un descriptor especial que no es necesario separarlo de los demás descriptores por comas, si
bien pueden usarse. Para salida: un slash envía la línea actual a salida y empieza una nueva. Así, una sentencia WRITE
puede escribir los valores de salida separados en dos líneas. Si aparecen varios slashes juntos, se saltarán varias líneas.

FUENTE Y MAYOR REFERENCIA:


http://ocw.unican.es/ensenanzas-tecnicas/fundamentos-de-informatica/Curso-Fortran-7.pdf [Sección 7.4]

Anda mungkin juga menyukai