02 mayo 2007

Textos, textos y más textos...

Algo que es útil y que te puede sacar de apuros muchas veces son los archivos de texto. Tal vez creas que son cosa del pasado, hoy en pleno siglo XXI con mil DBMSes chiroliros en el mercado, ¿y usar archivos de texto? Así es. Son muy usados todavía, por ejemplo, los archivos ini, inf y bat de Windows son archivos de texto, así como archivos de código fuente en lenguaje C (.c), C++ (.cpp), Visual Basic.net, Visual Basic 6.0 (.frm, .bas, etc.), etc.

Claro que no sirven para resolver todo tipo de problemas, para eso están los DBMS como Oracle o MySQL. Pero para generar reportes, guardar configuración o mandar datos a Excel, es eficiente. Como es útil, vamos a ver cómo manipular archivos de texto con Visual Basic 6.0.

Hice un pequeño proyecto que ejemplifica el uso de archivos de texto que puedes bajar aquí (todavía no sirve la liga, pero pronto lo podrás descargar). El programa tiene varias funciones: deja que el usuario escriba lo que sea en 24 cajas de texto, los almacena como archivos de texto "normales" o en formato CSV para abrirlos en Excel, abre archivos de texto y los elimina.

Para comenzar con el código, yo, en mi caso particular, decidí hacer un módulo que contiene una variable global (FileName) que almacena el nombre de archivo que se está manipulando (o sea, el que se quiere abrir, guardar o eliminar) y también almacena una función, FileWindow, que se encarga de abrir la ventana que deja que veas las unidades, carpetas y archivos para que selecciones el archivo a manipular y llena la variable global FileName con el resultado (así otras ventanas saben el nombre del archivo y la carpeta en donde se encuentra). Esto me ahorra código porque casi todas las funciones necesitan usar una ventana similar para almacenar, guardar o eliminar. No es absolutamente necesario hacerlo de esta manera, pero funciona. Aquí les muestro el código de el módulo.


Como puedes ver, solo carga la ventana frmFile, le cambia el Caption y lo muestra. Esta es la ventana frmFile primero en la vista diseño y luego al ejecutarlo y pedirle que abra un archivo):




Ok. Aquí escribo todo el código que contiene esta ventana. Básicamente son eventos que controlan los controles (valga la rebuznancia) del drive (Drive1), de la lista de carpetas (Dir1) y la lista de archivos (File1). El otro código usa la caja de texto que tiene el nombre del archivo (txtFile) y lo asigna a mi variable global (FileName, que ya expliqué anteriormente). Este es:


Ok. Hasta allí nos hemos ocupado de detallitos vanos y ruines que solamente nos sirven para ahorrarnos código más adelante. Ahora vamos a hablar del código que trabaja con los archivos de texto. Para esto, vamos a ver el código de la ventana principal que se encarga de guardar archivos de texto "normalazos" (es que hay otro botón que los guarda en formato CSV para su uso en Excel), lo que sucede cuando presionan un botón llamado cmdSave. Aquí pongo el código y abajo lo explico.

Comienzo declarando dos variables: i que controla un ciclo que graba las líneas de texto al archivo e Imprimir, una cadena que almacena lo que se va a escribir en el archivo, un renglón a la vez.
Después de las declaraciones, usa la función FileWindow, explicado anteriormente, para desplegar la ventana que permite buscar en unidades de disco, carpetas, etc. para especificar la carpeta y nombre del archivo a guardar. Si el usuario no presionó el boton Cancelar de esa ventana que pide los detalles del archivo (frmFile), o sea que el nombre del archivo (FileName) no es igual a una cadena vacía (porque el código del botón cancelar de frmFile le asigna una cadena vacía, "", a FileName), comienzo toda la onda.

Para manipular un archivo se tiene que abrir. Para eso me sirve la instrucción Open. Cuando abres un archivo tienes que decirle que archivo y que quieres hacer con él. Es igual que invitar a una chava a salir: tienes que decidir a qué chava (escribir el nombre del archivo) y decirle que quieres hacer con ella (por ejemplo, llevarla al cine, a cenar, a barrer y trapear tu cuarto, etc.), si no, las cosas no funcionan. Es por esto que escribo Open seguido del nombre completo del archivo (o sea con todo y la ruta de carpetas) y al final le escribo el uso que quiero hacer con el archivo. Como aquí quiero escribir datos al archivo, o sea darle salida a mis datos, le digo For Output.

Visual Basic tiene mucha confianza al trabajar con archivos, algo similar a lo que sucede en tu casa o con tus amigos. Tienes tanta confianza que no te llaman por tu nombre sino por un apodo. Visual Basic hace lo mismo: para referirse a un archivo a la que quiere escribir, o desde donde quiere leer datos, no lo hace por el nombre del archivo sino por un número del 1 al 9. Es por eso que al final de la instrucción Open le agregue el As #1. De esta manera, al usar instrucciones que manipulan al archivo (Close, Print, etc.) indico que todo va a funcionar con el archivo número 1. Para resumir, la sintáxis completa de la instrucción Open queda así:

Open nombre_del_archivo For uso As número

Después de abrir el archivo, uso un ciclo For para controlar el número de renglones que voy a escribir al archivo. Para hacerlo fácil y rápido uso una característica que tiene Visual Basic 6.0 y pierde en la versión .NET. Esto es el uso de arreglos de controles. Hice 3 arreglos de textboxes (txtTexto1, txtTexto2 y txtTexto3) cada uno con 8 elementos.

Con el contenido de las cajas de texto, armo la cadena que voy a escribir al archivo (Imprimir). Si no es una cadena vacía, o sea que escribieron algo en cualquier caja de texto de ese renglón, uso la función Print para escribir la cadena Imprimir al archivo.

En primer lugar, le tengo que decir el archivo al que quiero escribir la cadena (por medio del número, en nuestro caso 1) y la cadena que quiero escribir (en este caso, la cadena Imprimir). Por eso la instrucción queda como Print #1, Imprimir.

Después de escribir un renglón al archivo, vuelve a arrancar el ciclo y vuelve a hacer lo mismo. Al final de toda la escribidera, tengo que cerrar el archivo, con Close #1, o sea, cierra el archivo al que hace referencia el número 1.

El código que almacena un archivo CSV para su uso en Excel usa un código casi idéntico. Al principio se asegura de que la extensión sea CSV y todo lo demás es casi lo mismo, excepto que inserta comas entre las cadenas.

Los archivos CSV (Comma Separated Values) son archivos de texto que puede importarse directamente a Excel. Lo único que los hace diferentes es que cada renglón del archivo de tesxto corresponde a una fila de excel y los valores de las celdas se escriben seaprados por una coma, o sea que la coma separa los valores que van en las diferentes celdas de la fila. Para mayor información acerca de archivos CSV, dale click aquí.

Este es, por fin y después de tanto rollo, el código que genera los archivos CSV (esto se ejecuta cuando le das click al botón cmdExcel):


Solo hace un pequeño cambio para poder leer datos del archivo. Este es el código que abre un archivo de texto y vacía su contenido en otra ventana (frmRead) en una caja de texto (txtFileCont). Este es el código:


Lo que hago aquí es sencillo. Declaro una cadena que va a almacenar las líneas que voy leyendo del archivo (Cadena), luego uso mi función FileWindow para pedir el archivo que se va a abrir. Si el usuario da un nombre de archivo, abro el archivo para lectura. Esto se hace sustituyendo el For Output que usábamos para escribir al archivo, por For Input que indica que voy a leer datos del archivo. Y, en lugar de usar el Print para escribir al archivo, uso el Input. En mi caso leo un caracter a la vez para no errarle. La sintáxis es Input(no_de_caracteres_a_leer, no_de_archivo). Fácil, ¿no?

Como estoy leyendo caracter por caracter, lo hago dentro de un ciclo. Voy adjuntando los caracteres que voy leyendo a la caja de texto de la ventana donde voy a desplegar el contenido del archivo (frmRead.txtFileCont). Esto se repite hasta que llegue al final del archivo, cosa que pruebo usando la función EOF(no_de_archivo).

Otra operación que se realiza con frecuencia es eliminar gente, perdón, registros (bueno también se mata a mucha gente, pero ese es otra historia que no tiene que ver con archivos de texto). Para esto existe la instrucción linda y tierna Kill seguida por el nombre del archivo a eliminar. Esto se puede observar en este código que se ejecuta cuando se presiona el botón eliminar (cmdKill):


Creo que eso es todo. Lo único que no expliqué fue la ventana de "Acerca de..." (lo puse por pura vanidad). ¡Hasta la próxima!
Publicar un comentario
Related Posts Plugin for WordPress, Blogger...