Sunteți pe pagina 1din 6

Coleccin de Ejemplos de ADO

http://www.mvp-access.es/softjaen/bases/ado/sjspado022.htm

SJSPADO022: Cmo leer y escribir un archivo de texto plano mediante ADO


Por Enrique Martnez Montejo SoftJan [MS MVP - VB] ltima revisin: 20/02/2005 Muchos desarrolladores de Visual Basic creen que la biblioteca de ADO slo se utiliza para efectuar consultas a una base de datos, desconociendo otras posibilidades que nos brinda la biblioteca de Objetos de Datos ActiveX, como bien puede ser la lectura y escritura en un archivo de texto plano. La versin 2.5 de ADO introdujo, entre otros, el objeto St re a m, el cual nos proporciona una manera fcil de leer y escribir tanto en un archivo binario como de texto, por lo que podremos administrar la secuencia binaria de bytes, o de caracteres de texto, que constituye el flujo de un archivo. En el presente artculo, slo voy a detallar el objeto St re a m de texto como sustituto de la instruccin O p e n , que durante tantos aos hemos estado utilizando para efectuar operaciones de entrada y salida en un archivo de texto secuencial.
ndice

Escribir en un archivo de texto Leer el contenido de un archivo de texto Reemplazar datos en un archivo de texto Continuar la escritura en el archivo de texto Copiar el contenido de un archivo de texto y pegarlo en otro archivo

Escribir en un archivo de texto


Mediante el mtodo W ri t eTe xt de un objeto St re a m previamente abierto, podemos escribir en una secuencia el contenido existente en un archivo de texto, o en cualquier variable alfanumrica o control que presente texto, teniendo la posibilidad posteriormente de guardarla en disco, mediante el mtodo Sa veTo Fi l e de dicho objeto:

' Declaramos una variable objeto del tipo Stream ' Dim str As ADODB.Stream Dim Texto As String ' Creamos una nueva instancia del objeto ' Set str = New ADODB.Stream ' Obtenemos el texto que deseamos guardar ' Texto = "En un lugar de La Mancha de cuyo nombre no quiero acordarme ..." ' Configuramos el objeto Stream ' With str .Charset = "iso-8859-1" .Open .WriteText Texto .SaveToFile "C:\Quijote.txt .Close End With

' ' ' ' '

Indicamos el conjunto de caracteres Abrimos el objeto Escribimos los datos en el objeto Guardamos el archivo de texto Cerramos el objeto Stream

Con stas lneas hemos creado nuestro primer archivo de texto utilizando la biblioteca de ADO. Fcil! Verdad? A excepcin del valor de la propiedad C h a rs e t , los restantes valores son los predeterminados de las distintas propiedades y mtodos del objeto St re a m. En relacin con la propiedad C h a rs e t , ha de saber que la misma indica el conjunto de caracteres al que se debe convertir el contenido de un St re a m de texto, por lo que de no especificarse un juego de caracteres concreto, el contenido del objeto St re a m se guardar como texto Unicode, que es el valor predeterminado de dicha propiedad. Los valores permitidos en la propiedad C h a rs e t , son cadenas alfanumricas normales que se pasan a la interfaz de ADO como cadenas correspondientes a juegos de caracteres de Internet (por ejemplo, "iso-8859-1", "Windows1252", etc.). Para conocer los juegos de caracteres instalados en su sistema, consulte las subclaves existentes en la siguiente clave del Registro de Windows: HKEY_CLASSES_ROOT\MIME\Database\Charset. Al ser el juego de caracteres Unicode el valor predeterminado de la propiedad C h a rs e t , podemos crear fcilmente un archivo de vnculo de datos (*.udl) mediante el mtodo Sa veTo F i l e , debido a que dicho juego de caracteres es el que necesariamente se debe de utilizar para crear el archivo de vnculo de datos:

Dim str As ADODB.Stream Dim Texto As String

1 de 6

28/07/2011 09:13 a.m.

Coleccin de Ejemplos de ADO

http://www.mvp-access.es/softjaen/bases/ado/sjspado022.htm

Set str = New ADODB.Stream ' Configuramos el archivo de vinculo de datos, que necesariamente ' deber de presentar la siguiente estructura. ' Texto = "[oledb]" & vbCrLf & _ "; Everything after this line is an OLE DB initstring" & vbCrLf & _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Mis documentos\Neptuno.mdb;" & _ "Persist Security Info=False;" With str .Open .WriteText Texto .SaveToFile "C:\Test.udl", adSaveCreateOverWrite .Close End With
En ste ltimo ejemplo, observar que he especificado el valor opcional adSaveCreateOverWrite en el parmetro SaveOptions del mtodo Sa veTo F i l e , por lo que se sobrescribir el archivo si ste ya existe. El valor predeterminado es adSaveCreateNotExists, el cual producir un error interceptable si existe el archivo que deseamos guardar de sta forma podemos preguntar al usuario si desea sobrescribir el archivo existente: ,

With str .Open .WriteText Texto On Error Resume Next ' Intentamos guardar el archivo ' .SaveToFile "C:\Text.udl" ' Si el archivo ya existe, se producir un error interceptable ' If Err.Number = 3004 Then ' Preguntamos al usuario si desea sobrescribir el archivo If MsgBox("El archivo ya existe. Desea sobrescribirlo?", _ vbYesNo) = vbYes Then .SaveToFile "C\Test.udl", adSaveCreateOverWrite Err.Clear End If End If .Close End With
A la hora de ejecutar el mtodo W ri t eTe xt , procure que la longitud de la cadena de caracteres que se desea escribir sea distinta de cero, porque en ste supuesto se producir el error interceptable nmero 3001: Argumentos incorrectos, fuera de intervalo permitido o en conflicto con otros. En lugar de definir una variable alfanumrica (en el ejemplo, la variable Texto), para almacenar la cadena de caracteres que se pasar al mtodo W ri t eTe xt , podemos escribir directamente el texto con el citado mtodo, especificando si se escribe un carcter separador de lneas al final de la cadena especificada. Para ello, indicaremos el valor adWriteLine, el cual escribir en el objeto St re a m el carcter separador de lneas especificado en la propiedad L i n e Se p a ra t o r, que podr ser uno de los siguientes valores correspondientes a la enumeracin LineSeparatorsEnum: Constante adCR adCRLF adLF Valor 13 -1 10 Descripcin Indica un retorno de carro. Indica un retorno de carro y una nueva lnea. Es el valor predeterminado. Indica una nueva lnea.

El archivo de vnculo de datos anterior, tambin lo podemos crear de la siguiente manera:

Dim str As ADODB.Stream Set str = New ADODB.Stream

2 de 6

28/07/2011 09:13 a.m.

Coleccin de Ejemplos de ADO

http://www.mvp-access.es/softjaen/bases/ado/sjspado022.htm

With str .Open ' No es necesario indicar el valor adCRLF porque es el valor ' predeterminado. Slo se muestra para que observe que, si ' necesita especificar un carcter separador de lneas diferente, ' deber de establecer el valor de la propiedad LineSeparator, ' antes de ejecutar el mtodo WriteText. ' .LineSeparator = adCRLF .WriteText "[oledb]", adWriteLine .WriteText "; Everything after this line is an OLE DB initstring", adWriteLine .WriteText "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Mis documentos\Neptuno.mdb;" & _ "Persist Security Info=False;", adWriteLine .SaveToFile "C:\Test.udl", adSaveCreateOverWrite .Close End With
La propiedad Mo d e indica los permisos disponibles que se pueden especificar para modificar los datos en un objeto St re a m, los cuales se corresponden con los valores incluidos en la enumeracin ConnectModeEnum. El valor predeterminado para un objeto St re a m de texto es adModeUnknown, y se podr especificar cualquier valor de los existentes en la citada enumeracin, a excepcin de los siguientes: adModeRead (permisos de slo lectura), adModeWrite (permisos de slo escritura) y adModeRecursive.

Leer el contenido de un archivo de texto


Mediante el mtodo Re a d Te xt del objeto St re a m, podemos leer un nmero cualquiera de caracteres existentes en un archivo de texto. De no especificarse valor alguno en el parmetro opcional NumChars, el mtodo devolver una cadena alfanumrica con la secuencia completa del archivo de texto, de la misma manera que si especificamos un valor superior al nmero de caracteres existentes en el archivo de texto. El mtodo Re a d Te xt slo leer las secuencia de texto de un objeto St re a m, donde el valor de la propiedad Typ e coincida con su valor predeterminado (adTypeText). Si desea leer una secuencia binaria, deber utilizar el mtodo Re a d del objeto St re a m. El siguiente ejemplo mostrar en un control TextBox, el contenido completo de un archivo de texto cualquiera:

Dim str As ADODB.Stream ' Creamos una nueva instancia del objeto Stream Set str = New ADODB.Stream ' Configuramos el objeto Stream With str .Charset = "iso-8859-1" .Open .LoadFromFile ("C:\Quijote.txt") Text1.Text = .ReadText() .Close End With

' ' ' ' '

Indicamos el juego de caracteres Abrimos el objeto Cargamos el archivo de texto Leemos el archivo Cerramos el objeto Stream

Si en lugar de leer todo el archivo, slo deseamos mostrar un nmero determinado de caracteres, stos se tendran que especificar a la hora de ejecutar el mtodo Re a d Te xt :

' Abrimos el objeto Stream ' str.Open ' ' Leemos los 100 primeros caracteres ' Text1.Text = str.ReadText (100)
Reemplazar datos en un archivo de texto
Los ejemplos expuestos anteriormente, slo sirven para leer el archivo de texto, o bien escribir por completo el contenido del mismo, sobrescribiendo el archivo si as lo creemos oportuno. Pero puede suceder que nos interese reemplazar unos determinados caracteres en una posicin en concreto de nuestro archivo de texto. Para ello, una vez que hayamos cargado el objeto St re a m mediante el mtodo L o a d F ro mF i l e , indicaremos la posicin donde deseamos insertar el contenido, utilizando para ello la propiedad P o s i t i o n del objeto St re a m. A continuacin reemplazaremos los caracteres existentes a partir de la posicin 5 de nuestro archivo de texto:

3 de 6

28/07/2011 09:13 a.m.

Coleccin de Ejemplos de ADO

http://www.mvp-access.es/softjaen/bases/ado/sjspado022.htm

' Declaramos una variable objeto del tipo Stream ' Dim str As ADODB.Stream ' Creamos una nueva instancia del objeto ' Set str = New ADODB.Stream ' Configuramos el objeto Stream With str .Charset = "iso-8859-1" .Open ' Cargamos el archivo de texto .LoadFromFile ("C:\Quijote.txt") ' Especificamos la posicin .Position = 5 ' Reemplazamos los datos en el objeto .WriteText " CARACTERES A INSERTAR " ' Sobrescribimos el archivo de texto .SaveToFile "C:\Quijote.txt", adSaveCreateOverWrite .Close End With
De no especificar el valor de la propiedad P o s i t i o n , se reemplazarn los primeros caracteres del archivo de texto correspondientes a la longitud del texto que se haya especificado, dado que al llamar al mtodo L o a d F ro mF i l e , la posicin actual se establece al principio del objeto St re a m, debido a que el valor de la propiedad P o s i t i o n ser igual a cero.

Continuar la escritura en el archivo de texto


Si nuestra intencin es abrir el archivo de texto para continuar con la escritura en el mismo, entonces deberemos de especificar como valor de la propiedad P o s i t i o n , el valor que actualmente tenga la propiedad Si z e , la cual devuelve el tamao de la secuencia de caracteres en nmero de bytes. Si no se conoce el tamao de la secuencia, la propiedad Si z e devolver -1.

' Configuramos el objeto Stream With str .Charset = "iso-8859-1" .Open ' Cargamos el archivo de texto .LoadFromFile ("C:\Quijote.txt") ' Indicamos que deseamos continuar con la escritura del archivo .Position = .Size ' Insertamos los nuevos caracteres .WriteText " CARACTERES A INSERTAR " ' Sobrescribimos el archivo de texto .SaveToFile "C:\Quijote.txt", adSaveCreateOverWrite .Close End With
Si se especifica un valor para la propiedad P o s i t i o n superior al valor de la propiedad Si z e , se obtendr un error interceptable en tiempo de ejecucin. Para conocer si el valor de la posicin actual se encuentra al final de la secuencia de caracteres, consulte el valor de la propiedad E O S, la cual devolver True si no hay ms bytes en la secuencia, y False si hay ms bytes despus de la posicin actual. Como la propiedad E O S es de slo lectura, puede especificar explcitamente que una posicin en concreto se tome como el final de la secuencia, llamando al mtodo Se t E O S, el cual establecer automtica a True el valor de la propiedad E O S. Pero tenga mucho cuidado con ste mtodo, porque si no especifica el valor de la propiedad P o s i t i o n con anterioridad a la llamada al mtodo, reemplazar por completo el contenido del archivo de texto con los nuevos datos que escriba en el mismo. Igualmente, si el valor de la propiedad P o s i t i o n se ha especificado a una posicin anterior al final real de la secuencia, perder todos los datos que estn a continuacin de la posicin indicada, dado que los mismos se truncarn con los nuevos datos escritos. Deber tener en cuenta que la propiedad P o s i t i o n , siempre mide en bytes. Si el objeto St re a m de texto utiliza un juego de caracteres de varios bytes, como bien podra ser el juego de caracteres por defecto (Unicode), para determinar el nmero de caracteres deber de multiplicar la posicin por el tamao del carcter. Para el juego de caracteres Unicode, -donde cada carcter est representado por dos bytes-, el primer carcter estar en la posicin 0, el segundo en la posicin 2, el tercero en la posicin 4, y as sucesivamente. Referente a la propiedad P o s i t i o n , por ltimo indicar que no podr especificar valores negativos para modificar la posicin actual del objeto St re a m. Si deseamos continuar escribiendo en un archivo de texto, con los datos existentes en un control TextBox, ejecutaramos lo siguiente:

' Declaramos una variable objeto del tipo Stream

4 de 6

28/07/2011 09:13 a.m.

Coleccin de Ejemplos de ADO

http://www.mvp-access.es/softjaen/bases/ado/sjspado022.htm

' Dim str As ADODB.Stream Dim Texto As String ' Creamos una nueva instancia del objeto ' Set str = New ADODB.Stream ' Configuramos el objeto Stream With str .Charset = "iso-8859-1" .Open .LoadFromFile ("C:\Quijote.txt") ' Leemos el contenido total del archivo, por lo que la propiedad ' EOS se establecer a True, con lo cual no ser necesario llamar ' al mtodo SetEOS. ' Texto = .ReadText ' Escribimos el contenido del control TextBox ' .WriteText Text1.Text .SaveToFile "C:\Quijote.txt", adSaveCreateOverWrite .Close End With
Copiar el contenido de un archivo de texto y pegarlo en otro archivo
Puede ser que nos interese insertar en nuestro archivo de texto, el contenido completo, o parte del mismo, existente en otro archivo de texto diferente, o bien, crear otro archivo de texto que utilice un juego de caracteres distinto al que actualmente estamos utilizando. De todo esto se encarga el mtodo C o p yTo del objeto St re a m, el cual copia el nmero especificado de caracteres de un objeto St re a m en otro objeto St re a m de destino, que previamente deber de estar abierto, si no deseamos obtener el oportuno error en tiempo de ejecucin. Tal y como se indic en su momento, no es necesario especificar la propiedad Typ e , debido a que por defecto, se entiende que los datos del archivo son de texto (adTypeText). El siguiente ejemplo copiar el contenido completo de un archivo de texto, a continuacin del final de otro archivo, que se corresponder con el archivo de texto de destino:

' ' Declaramos dos objetos Stream ' Dim oStrOrig As New ADODB.Stream Dim oStrDest As New ADODB.Stream ' ' Abrimos el objeto Stream de origen ' With oStrOrig .Charset = "iso-8859-1" .Open .LoadFromFile ("C:\Archivo_Origen.txt") ' Abrimos el objeto Stream de destino ' With oStrDest .Charset = "iso-8859-1" .Open ' Cargamos el archivo de texto ' .LoadFromFile ("C:\Archivo_Destino.txt") ' Nos posicionamos al final del archivo ' .Position = .Size ' Copiamos en el archivo de destino, el contenido ' total del archivo de origen ' oStrOrig.CopyTo oStrDest ' Sobrescribimos el archivo de destino ' .SaveToFile "C:\Archivo_Destino.txt", adSaveCreateOverWrite

5 de 6

28/07/2011 09:13 a.m.

Coleccin de Ejemplos de ADO

http://www.mvp-access.es/softjaen/bases/ado/sjspado022.htm

.Close End With .Close End With


Si deseamos insertar un nmero determinado de caracteres, en una posicin especfica del archivo de texto de destino, escribiramos lo siguiente:

' Declaramos dos objetos Stream ' Dim oStrOrig As New ADODB.Stream Dim oStrDest As New ADODB.Stream ' Abrimos el objeto Stream de origen ' With oStrOrig .Charset = "iso-8859-1" .Open .LoadFromFile ("C:\Archivo_Origen.txt") ' Especificamos la posicin donde empezaremos a leer .Position = 190 ' Abrimos el objeto Stream de destino ' With oStrDest .Charset = "iso-8859-1" .Open ' Cargamos el archivo de texto ' .LoadFromFile ("C:\Archivo_Destino.txt") ' Indicamos la posicin donde deseamos insertar el texto ' .Position = 160 ' Reemplazamos en el archivo de destino, los caracteres ' especificados en el parmetro CharNumber, en el ejemplo ' 20 caracteres. ' oStrOrig.CopyTo oStrDest, 20 ' Sobrescribimos el archivo de destino ' .SaveToFile "C:\Archivo_Destino.txt", adSaveCreateOverWrite .Close End With .Close End With

Otros tips de inters: Indice de Ejemplos de ADO Enrique Martnez Montejo - 2005 NOTA: La informacin contenida en este ejemplo, as como el cdigo fuente incluido en el mismo, se proporciona COMO EST, sin garantas de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en prctica, utilizar o ejecutar lo explicado, recomendado o sugerido en el presente artculo. This article is provided AS IS with no warranties, and confers no rights. You assume all risk for your use.

6 de 6

28/07/2011 09:13 a.m.

S-ar putea să vă placă și