(Scilab) Tutorial - Archivos Texto

Ing. Cristina González Córdova TC1017 Solución de Problemas con Programación Tutorial Manejo de Archivos de Texto en Sci

Views 291 Downloads 7 File size 843KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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) // 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