Вы находитесь на странице: 1из 33

Trabajar con los datos de un archivo de texto

Por Enrique Martnez Montejo [MS MVP - VB]

ltima revisin: 11/05/2003

ndice 1. Utilizar objetos de acceso a datos con archivos de texto 2. El archivo de informacin de esquema Schema.ini 2.1. Estructura de los archivos Schema.ini 2.2. El formato de archivo 2.3 Nombres, longitud y tipos de campos 2.4 Juego de caracteres 2.5 Otras opciones de formato y conversin de tipos de datos Crear un archivo Schema.ini con el Administrador de orgenes de datos 2.6 ODBC 2.7 Ejemplos de archivos de informacin de esquema Schema.ini 3. El delimitador de texto y la opcin TextDelimiter 4. Abrir directamente un archivo de texto 4.1. Mediante DAO mostrando los datos en un DBGrid 4.2. Mediante ADO visualizando la informacin en un DataGrid 4.3. Mediante ADO utilizando el driver de texto ODBC 4.4. Utilizando ASP con un origen de datos (DSN) 5. Vinculacin de archivos de texto 5.1. Vincular con ADOX un archivo de texto a una base de datos Access 5.2. Utilizar DAO para vincular un archivo de texto 6. Cmo crear y eliminar una tabla de texto 7. Cmo importar los datos de un archivo de texto 7.1. Importar los datos a una base de Access 7.2. Importar los datos a una hoja de clculo Excel 7.3. Importar los datos a otro archivo de texto 8. Cmo exportar los datos desde el propio archivo de texto 9. Cmo exportar datos a un archivo de texto 9.1. Exportar los datos de una tabla de Access 9.2. Exportar los datos de una hoja de clculo Excel 10.Aadir registros a una tabla procedentes de un archivo de texto delimitado 10.1.Desde la propia base de datos Access activa 10.2.Desde el propio archivo de texto activo 11.Aadir nuevos registros a nuestro archivo de texto

11.1.Desde un archivo de dBASE activo 11.2 Desde el propio archivo de texto activo 12.Algunos artculos tiles de Microsoft Knowledge Base

1. Utilizar objetos de acceso a datos con archivos de texto Mediante el formato Text del Mtodo de Acceso Secuencial Indexado Instalable (IISAM) de Microsoft Jet, podemos utilizar la informacin contenida en un archivo de texto, tanto si los campos estn delimitados por caracteres como si son de longitud fija, para abrir dichos archivos de texto, o para importar, exportar o vincular los datos desde, o hacia, otros formatos de bases de datos, aunque en ste artculo, el nico formato de base de datos que se utilizar es el formato de Microsoft Access 2000, utilizando para ello las dos bibliotecas ms conocidas de acceso a datos, como son Microsoft DAO 3.6 Object Library (DAO) y Microsoft ActiveX Data Object (ADO). Antes de comenzar, quiero hacer hincapi en la necesidad de tener instalado previamente en nuestro sistema el archivo MSTEXTxx.DLL, que es el controlador ISAM de texto, a fin de evitar el error Imposible encontrar el ISAM instalable. De estar instalado, por defecto se encontrar en la carpeta System, o en la carpeta que indique el valor win32 de la clave del registro de windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\x.x\Engines\Text, siendo x.x la versin correspondiente al motor Microsoft Jet que est disponible en nuestro sistema. Por tanto, si al instalar Visual Basic no se instal dicho controlador, ejecute de nuevo el programa de instalacin y seleccione los controladores ISAM apropiados para proceder a su instalacin. Si piensa utilizar la biblioteca de ADO, tenga en cuenta que la versin del proveedor necesaria que hay que utilizar es la versin del proveedor Jet 4.0; el proveedor Jet 3.51 no soporta los drivers ISAM de Jet. Para descargar las distintas versiones de los componentes de acceso a datos de Microsoft (MDAC), visite la siguiente direccin: http://www.microsoft.com/data. En cuanto a la forma en que el motor Microsoft Jet reconoce los valores nulos, hay que tener en cuenta lo siguiente: Datos delimitados por caracteres. Se reconocer el valor nulo por la presencia de dos caracteres delimitadores consecutivos. Datos de longitud fija. Se reconocer dicho valor por la ausencia de datos (espacios en blanco) en la columna de datos correspondiente.

Otra cuestin importante a tener en cuenta son las limitaciones en cuanto al tamao de las tablas y objetos de texto: Elemento Campo Nombre del campo Ancho del campo Tamao del registro Tamao mximo por archivo de texto 255 64 caracteres 32.766 caracteres 65.000 bytes

Otra limitacin importante que presenta el ISAM de Texto del motor Microsoft Jet, es que slo nos permitir aadir nuevos registros al archivo de texto, por lo que no podremos

eliminar registros o actualizar los datos existentes en dicho archivo, ya que obtendremos el siguiente mensaje de error: Este ISAM no admite la actualizacin/eliminacin de datos en una tabla vinculada. Por tanto, no podremos ejecutar los comandos DELETE o UPDATE de SQL, as como cualquier otro mtodo de algn objeto de acceso a datos que implique ejecutar dichas acciones. Para ms informacin, se puede consultar el siguiente artculo de la Knowledge Base: El driver de texto ODBC slo soporta la instruccin INSERT. A la hora de establecer una conexin con un archivo de texto, el contenido de la informacin necesaria para tal fin se especifica de la siguiente manera: Elemento Tipo de base de datos Nombre de la base de datos Nombre de la tabla Informacin TEXT Ruta completa de la carpeta que contiene el archivo de texto El nombre del archivo de texto, includa su extensin. Si no se especifica la extensin del archivo, sta tomar la extensin predeterminada .txt.

Por ltimo, si tiene pensado utilizar un archivo de texto en un entorno multiusuario, vyase olvidando de tal posibilidad, porque cuando se abre un archivo de texto mediante Microsoft Jet, se tiene acceso exclusivo al archivo, y cualquier otro intento de conexin a dicho origen de datos por parte de algn otro usuario, obtendr el correspondiente mensaje de error.

2. El archivo de informacin de esquema Schema.ini Aunque el motor Microsoft Jet puede determinar el formato del archivo de texto con slo leerlo directamente, siempre y cuando el archivo est delimitado por el carcter predefinido en el registro de Windows, es recomendable, -y aadira que hasta necesario-, utilizar un archivo de informacin de esquema si deseamos tener un control completo sobre la manera de conseguir la informacin contenida en un archivo de texto. De esto se encarga un archivo cuyo nombre siempre ser Schema.ini, el cul deber de guardarse en la misma carpeta donde se encuentre el origen de datos, es decir, el archivo de texto con el que vamos a trabajar. Dicho archivo de configuracin se encarga de proporcionar al ISAM instalable la informacin sobre el formato general del archivo, el nombre de los campos o columnas, as como el tipo de datos que contienen, y su presencia siempre ser obligatoria cuando: Accedamos a datos de longitud fija. El archivo de texto contenga tipos de datos DateTime, Currency o Decimal. Deseamos elegir un juego de caracteres distinto al valor predeterminado existente en la configuracin del registro de Windows. en los se de

Para que el lector se haga una idea de como trabaja el ISAM de Texto, comentar que, principio, el driver no obtiene los valores iniciales del archivo Schema.ini, sino que obtiene directamente de los valores existentes en el registro de Windows, por tanto, aplicar por defecto el mismo formato de archivo a todas las nuevas tablas de datos

texto que se creen. Slo si los valores del registro son diferentes de los valores existentes en el archivo de informacin de esquema Schema.ini, se pasarn por alto los valores existentes en el registro, tenindose en cuenta nicamente los valores especificados en el archivo Schema.ini para un archivo de texto en particular. 2.1. Estructura de los archivos Schema.ini Al igual que cualquier otro archivo *.ini de configuracin del sistema, el archivo Schema.ini se compone de una seccin entre corchetes con el nombre del archivo de texto de origen, y de una serie de entradas cuyos valores contendrn la caractersticas de la tabla: El formato del archivo. Los nombres, longitud y tipos de los campos. El juego de caracteres utilizado. Conversiones especiales de tipos de datos.

Como se ha dicho, la primera seccin del archivo de esquema siempre ser el nombre del archivo de texto, el cual estar escrito entre corchetes. Si nuestro archivo de texto que contiene los datos se llama Clientes.txt, la seccin del archivo de configuracin ser: [Clientes.txt] 2.2. El formato del archivo El valor Format especifica el formato del archivo de texto y su inclusin en un archivo Schema.ini, anular la configuracin existente en el Registro de Windows, para dicho archivo de texto en particular. En principio, se puede utilizar como delimitador de campos cualquier carcter, a excepcin de las comillas dobles ( ''), aunque como se ver posteriormente al estudiar el parmetro TextDelimiter, existe la posibilidad de que se pueda utilizar tambin dicho valor. Los valores vlidos para Format pueden ser: Format TabDelimited CSVDelimited Delimited (*) Formato de la tabla Los campos estn delimitados por tabulaciones. Los campos estn delimitados por comas (,). Los campos estn delimitados por asteriscos. Se puede utilizar cualquier carcter, excepto las comillas dobles (''). Los campos del archivo son de longitud fija.

FixedLength

Para especificar un formato delimitado por comas, hay que escribir: Format=CSVDelimited Respecto al formato delimitado por comas, tengo que hacer la salvedad de que no funcionar en un sistema operativo con la configuracin regional de espaol, ya que obtendremos el mensaje de error: El separador de campos de la especificacin de archivo de texto coincide con el separador decimal o el delimitador de texto .

Esto es debido a que la configuracin regional de espaol utiliza el signo de la coma para separar la parte entera de la fraccionaria, tanto de un valor numrico como monetario. Por tanto, tenemos tres posibilidades para evitar el citado error: Modificar el carcter del smbolo decimal en la configuracin regional de Windows a la hora de trabajar con los datos de un archivo de texto, de tal forma que sea distinto de la coma, no olvidando posteriormente restablecer la configuracin anterior a fin de evitar problemas de interpretacin con otros datos numricos o monetarios. Elegir otra configuracin regional distinta a la de espaol que no utilice la coma como smbolo decimal (ingls, por ejemplo). Debido a que se permite elegir cualquier carcter distinto de las comillas dobles, utilizar cualquier otro carcter diferente de la coma para delimitar los campos del archivo de texto, opcin sta que sera la ms acertada para un usuario con una configuracin regional de espaol. En los ejemplos del presente articulo, salvo que se indique lo contrario, se utilizar como delimitador de campos el carcter de punto y coma (;), que es el carcter por defecto del motor Jet establecido en la configuracin del registro de Windows.

2.3. Nombres, longitud y tipos de campos Hay que distinguir si el archivo de texto est delimitado por caracteres o es de longitud fija. En el primer caso, se puede especificar los nombres de los campos de dos formas: A. Escribir los nombres de los campos en la primera lnea del archivo de texto y establecer en el archivo de configuracin el parmetro ColNameHeader a True. El utilizar ste parmetro anula el valor FirstRowHasNames, establecido en el Registro de Windows, slo para ste archivo. B. Especificar en el archivo de configuracin cada campo por su nmero, asignndole al mismo tiempo el nombre y el tipo de datos del campo. En el supuesto de archivos de texto de longitud fija, slo se puede especificar cada campo de la forma expuesta en el apartado B. Para determinar los tipos de datos que contendrn los campos se puede especificar el parmetro MaxScanRows, de sta forma le indicamos al motor de base de datos el nmero de filas que debe examinar para que nos indique el tipo de campo de aqullos. Al igual que los dems valores, el establecer ste parmetro anular el valor existente en el registro de Windows para ste archivo en particular. El valor puede ser cualquier nmero; si el valor es cero (0), se examinar todo el archivo. A continuacin se muestra un ejemplo que utiliza los datos de la primera fila del archivo de texto para determinar los nombres de los campos. Asimismo, se le indica que examine el archivo completo para poder determinar los tipos de datos que contienen: ColNameHeader = True MaxScanRows = 0 Como se ha dicho anteriormente, la opcin del nmero de columna Coln para la definicin de los campos de la tabla, es opcional para los archivos delimitados por caracteres y

obligatorio para los archivos de longitud fija. La sintaxis es la siguiente: Coln = nombre_columna tipo [Width #] Parmetro Descripcin

nombre_columna Nombre del campo. Es importante destacar que, si el nombre del campo de la tabla original contiene espacios en blanco incrustados, ste se deber de escribir necesariamente entre comillas dobles, y slo en ste caso. tipo Los tipos de datos pueden ser: Tipo de datos Microsoft Jet Bit Byte Currency DateTime Double Long Memo Short Single Text ancho Tipo de datos ADO / ODBC Bit Byte Cyrrency Date Float Long LongChar Integer Single Char

La palabra Width, la cual indica que el siguiente nmero especifica el ancho del campo. Es opcional para los archivos delimitados por caracteres, y obligatorio para los archivos de longitud fija. Nmero entero que especifica el ancho del campo el cul es obligatorio si se especifica Width.

El siguiente ejemplo define tres campos de la tabla mediante la opcin del nmero de columna Coln, utilizando para ello los tipos de datos de Microsoft Jet: Col1 = IdCliente Long Col2 = Nombre Text Width 50 Col3 = "Fecha Alta" DateTime 2.4. Juego de caracteres Para indicarle al ISAM el juego de caracteres que tiene que utilizar, en el archivo de informacin de esquema estableceremos la entrada CharacterSet, la cual podr tener como valor uno de los siguientes juegos de caracteres disponibles: ANSI, OEM y Unicode. Dicho valor, anular el existente con idntico nombre, y para cada archivo de texto individual, en la siguiente clave del registro de Windows: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text En una configuracin regional de espaol internacional, elegir el juego de caracteres ANSI permite que aparezcan las tildes ortogrficas (acentos) y la letra , las cuales

perfectamente pueden existir en las cadenas de caracteres de nuestro archivo de texto: CharacterSet = ANSI En lugar de las palabras ANSI/OEM/Unicode, tambin se puede utilizar los valores numricos 850 para el juego de caracteres OEM, 1200 para Unicode, y 1252 para el de ANSI, que sera el valor predeterminado existente en el registro de Windows para una configuracin regional de Espaol. 2.5. Otras opciones de formato y conversin de tipos de datos En el archivo de informacin de esquema Schema.ini se pueden establecer otras opciones para especificar cmo se convierten o se muestran los datos cuando sean ledos por el motor de datos Microsoft Jet. Dichas opciones son sumamente importantes si queremos presentar un formato especfico de fecha, formato de nmero negativo, nmero de dgitos decimales o el smbolo de la moneda, ya que, de omitir dichas entradas, se utilizarn por defecto los valores que actualmente se encuentren establecidos en la Configuracin Regional del Panel de Control de Windows. A continuacin se enumeran las opciones disponibles. Opcin CurrencyDecimalSymbol Descripcin Carcter nico para separar la parte entera de la fraccioriaria de un valor monetario: Ejemplo : CurrencyDecimalSymbol = , Valor numrico que especifica el nmero de digitos decimales que se utilizar para representar una cantidad monetaria: Ejemplo: CurrencyDigits = 2 Uno de los siguientes valores con la representacin del simbolo monetario que se haya establecido como valor en la opcin CurrencySymbol: Valor 0 1 2 3 4 5 6 7 8 (Predeterminado) 9 10 11 12 13 14 Representacin en dlares USA -$1 -$1 $-1 $1(1$) -1$ 1-$ 1$-1 $ -$ 1 1 $$ 1$ -1 1- $ ($ 1)

CurrencyDigits

CurrencyNegFormat

15 CurrencyPosFormat

(1 $)

Ejemplo: CurrencyNegFormat = 8 Cualquiera de los siguiente valores: Valor 0 1 2 3 Descripcin $1 (sin espacio de separacin) 1$ (sin espacio de separacin) $ 1 (un espacio de separacin) 1 $ (un espacio de separacin)

Ejemplo: CurrencyPosFormat = 3 CurrencySymbol Indica el simbolo de moneda o texto de la misma, que se utilizar en los valores monetarios incluidos en el archivo de texto. Los espaoles pueden indicar el smbolo del euro. Ejemplo: CurrencySymbol = $

CurrencyThousandSymbol Carcter nico para separar los miles de un valor monetario: Ejemplo: CurrencyThousandSymbol = . DateTimeFormat El formato de cadena utilizado para las fechas y horas. Necesariamente hay que especificar sta opcin si todos los campos de fecha/hora se tratan con el mismo formato. Todos los formatos de Microsoft Jet son compatibles, excepto A.M. y P.M. Ejemplo: DateTimeFormat = dd/mm/yyyy Carcter nico para separar la parte entera de la fraccionaria de un valor numrico: Ejemplo: DecimalSymbol = , Valor numrico que especifica el nmero de digitos decimales que se utilizar para representar una cantidad numrica: Ejemplo: NumberDigits = 2 Valor boolean que indicar si los valores numricos decimales menores que I y mayores que -1 deben contener ceros a la izquierda (TRUE) o no (FALSE). Ejemplo: NumberLeadingZeros = TRUE

DecimalSymbol

NumberDigits

NumberLeadingZeros

2.6. Crear un archivo Schema.ini con el Administrador de orgenes de datos ODBC Mediante el Administrador de Orgenes de datos ODBC, incluido en el Panel de Control de Windows, podemos crear y configurar un origen de datos DSN para trabajar con los archivos de texto que tengamos en una carpeta en particular, utilizando el controlador ODBC de texto. Para ello, creamos un nuevo DSN eligiendo el driver Microsoft Text Driver (*.txt;*.csv), mostrndose a continuacin el cuadro de dilogo Configuracin de ODBC de texto. Una vez aqu, escribimos el nombre del origen de datos, una pequea descripcin y desmarcamos la casilla de verificacin Usar directorio actual, lo que har que se habilite el comando Seleccionar directorio... Pulsamos sobre dicho botn y seleccionamos el directorio donde se encuentren nuestros archivos de texto que contienen los datos con los que vamos a

trabajar. Una vez seleccionado el directorio, pulsamos sobre el botn Opciones para que se nos ample el cuadro de dilogo de Configuracin de ODBC de texto. Observaremos la lista de extensiones permitidas para los archivo de texto, teniendo la oportunidad de aadir y eliminar extensiones a las ya existentes, una vez que desmarquemos la verificacin de Predeterminada(*.*). Pulsamos sobre el botn Definir formato..., para que se nos abra el cuadro de dilogo Definir formato de texto. En este nuevo cuadro de dilogo, podemos ver una lista de todos los archivos existentes en la carpeta que cumplen con la extensin especificada. Si seleccionamos la opcin default, podremos establecer una configuracin por defecto para todos los archivos de texto que estn en la carpeta seleccionada; si no hay archivos de texto, se ignorar las opciones seleccionadas. Igualmente, si seleccionamos el nombre de un archivo de texto, podemos establecer una configuracin individual para dicho archivo de texto. Una vez especificadas la opciones de configuracin, pulsamos sobre el botn Estimar para que surtan efecto las mismas. Si hemos especificado Encabezado nombre columna, al aceptar la configuracin, inmediatamente veremos los campos, nombre y tipos de datos que conforman nuestro archivo de texto, teniendo la oportunidad de agregar, modificar y eliminar campos de dicho archivo de texto. Una vez aceptados todos los cambios, se generar en la carpeta seleccionada, un archivo de esquema Schema.ini, con las configuraciones elegidas para cada uno de los archivos de texto que se encuentren incluidos en la carpeta. 2.7. Ejemplos de archivos de informacin de esquema Schema.ini En un mismo archivo de configuracin Schema.ini pueden existir varias configuraciones para importar/exportar distintos archivos de texto, siempre y cuando aqullas estn delimitadas por sus respectivas secciones, que indicarn a su vez, los nombres de los archivos de texto con los que vamos a trabajar. El ejemplo siguiente muestra la configuracin de un archivo de ancho fijo: [Poliza.txt] ColNameHeader=False Format=FixedLength MaxScanRows=25 CharacterSet=OEM Col1=COL1 Char Width 2 Col2=COL2 Char Width 21 Col3=COL3 Char Width 11 Col4=COL4 Integer Width 11 Col5=COL5 Single Width 7 Col6=COL6 Char Width 16 Col7=COL7 Single Width 5 Col8=COL8 Char Width 12 A continuacin se muestra la configuracin de un archivo delimitado:

[Clientes.txt] ColNameHeader=True CharacterSet=ANSI Format=Delimited(|) Col1=IdCliente Integer Col2=Apellidos Char Width 30 Col3=Nombre Char Width 50 Col4=NIF Char Width 9 Col5=Domicilio Char Width 50 Col6=CodPostal Char Width 50 Col7=Localidad Char Width 50 Col8=Telefono Char Width 50 Col9=FechaNto Date Col10=FechaAlta Date Col11=Activo Bit Col12=FechaBaja Date Col13=Causa Char Width 50 Por ltimo, un ejemplo que muestra los distintos parmetros que se pueden establecer en el archivo de esquema Schema.ini: [Ejemplo.txt] ColNameHeader=True Format=TabDelimited MaxScanRows=25 CharacterSet=ANSI DateTimeFormat=dd/mm/yyyy CurrencySymbol=Euro CurrencyPosFormat=9 CurrencyThousandSymbol=. CurrencyDecimalSymbol=, DecimalSymbol=, NumberDigits=2 NumberLeadingZeros=True

3. El delimitador de texto y la opcin TextDelimiter Como se ha visto anteriormente, la opcin Format especifica el carcter que utiliza nuestro archivo de texto para delimitar los campos que se incluyen en el mismo, y en principio, su valor puede ser cualquier carcter a excepcin de las comillas dobles ( ''). El delimitador de texto o cualificador de texto (que es el nombre que utiliza el asistente para exportacin de texto de Microsoft Access), es el carcter que utilizamos para delimitar el valor contenido en un campo de tipo alfanumrico de nuestro archivo de texto, por tanto deberemos tener especial cuidado en no confundir ambos delimitadores cuando lo utilicemos en el archivo de informacin de esquema Schema.ini. El carcter de delimitador de texto por defecto son las comillas dobles ( "), de ah que la opcin Format no pueda tomar dicho valor, ya que obtendramos el siguiente error: El

separador de campos de la especificacin de archivo de texto coincide con el separador decimal o el delimitador de texto. Pero puede ocurrir que nos veamos en la imperiosa necesidad de trabajar con un archivo de texto cuyos campos estn delimitados por comillas dobles, o bien, estamos utilizando delimitadores de texto no estndar, como la comilla simple ( ') o la coma (,), con valores de campos de texto que adems incluyen comillas simples o comas, como por ejemplo nombres ingleses o domicilios de clientes. Ante tales dificultades, la nica solucin que nos queda, a fin de evitar el mensaje de error mencionado anteriormente, es incluir la opcin TextDelimiter en el archivo Schema.ini, cuyo valor ser el carcter que nos servir para definir el delimitador de texto, y por tanto, poder optar por otro valor distinto al predeterminado de las comillas dobles. Veamos un ejemplo. Imaginad que tenemos la siguiente lnea de texto, cuyos campos estn separados por comas (Format), y se utiliza la comilla simple como delimitador de texto ( TextDelimiter): 'Martnez Flores, Javier','Av. Concha Espina, 34 - 4 B','Madrid','28016' Si no utilizamos ningn archivo Schema.ini para indicar los valores de ambos delimitadores, al importar el archivo de texto, los campos Nombre y Domicilio se han dividido, ya que al incluir los datos una coma, el ISAM lo ha tomado como si de un campo distinto se tratara: Campo1 Campo2 'Martnez Flores Javier' Campo3 Campo4 'Av. Concha Espina 34 - 4 B' Campo5 'Madrid' Campo6 '28016'

En cambio, si en el archivo Schema.ini especificamos los valores correspondientes a ambos delimitadores, los datos se tomarn correctamente: Format=CSVDelimited TextDelimiter=' Campo1 Martnez Flores, Javier Campo2 Av. Concha Espina, 34 - 4 B Campo3 Madrid Campo4 28016

Si la opcin TextDelimiter es distinta a las comillas dobles, la opcin Format puede contener dicho carcter de separacin, por lo que ya estamos en condiciones de trabajar con un archivo de texto delimitado por comillas dobles ( "). Por ltimo indicar que, si no deseamos utilizar ningn tipo de carcter como smbolo delimitador de texto (comillas dobles, simples, etc.), necesariamente debemos de indicar el valor none en el parmetro TextDelimiter de nuestro archivo de informacin de esquema Schema.ini: TextDelimiter=none Para ms informacin, consltese el siguiente artculo de la Knowledge Base: Los archivos de texto que utilizan delimitadores no estndar de texto no se

analizan adecuadamente con el driver de texto de Microsoft

4. Abrir directamente un archivo de texto A continuacin voy a explicar varios procedimientos para abrir directamente un archivo de texto utilizando para ello las bibliotecas de acceso a datos Microsoft Data Access Object Library (DAO) y Microsoft ActiveX Data Object Library (ADO), as como el driver de texto de Conectividad Abierta de Bases de Datos (ODBC). Resaltar que el ISAM de Texto de Microsoft Jet slo nos permitir aadir nuevos registros al archivo de texto, siempre y cuando el objeto Recordset se haya abierto con permisos de escritura. No podremos modificar ni eliminar datos del archivo de texto, ya que obtendremos el siguiente mensaje de error: Este ISAM no admite la actualizacin/eliminacin de datos en una tabla vinculada . Si deseamos evitar el error, no nos queda ms solucin que abrir el archivo de texto en modo de slo lectura, pero en ste caso, no podremos tampoco aadir nuevos registros. 4.1. Mediante DAO mostrando los datos en un DBGrid Hay que utilizar el mtodo OpenDatabase del objeto DBEngine donde se indicar la ruta, el modo de acceso (slo lectura o lectura/escritura), y el tipo de la base de datos de origen, el cual, siempre ser TEXT;. Asimismo, y a pesar de ser un valor opcional, es necesario establecer explcitamente a True/False el valor del parmetro Opciones del mtodo OpenDatabase, ya que de lo contrario, obtendremos el error 3051 en tiempo de ejecucin. En este ejemplo, vamos a utilizar un simple control Data para que automticamente se llene el control DBGrid, por tanto, en tiempo de diseo es necesario establecer la propiedad DataSource del control DBGrid con el nombre de un control Data, ya que el control DBGrid no admite automatizacin. El ejemplo abre el archivo de texto Clientes, que se encuentra en la carperta Mis documentos, creando un objeto Recordset: Dim db As Database Dim rs As Recordset ' Abrimos el archivo de texto, donde indicamos el nombre de ' la carpeta, el modo compartido, el acceso de lectura/escritura, ' y el tipo de la base de datos que vamos a utilizar. Set db = OpenDatabase ("C:\Mis documentos", True, False, "TEXT;") ' Creo el Recortdset Set rs = db.OpenRecordset ("Clientes") ' Establezco el Recordset del control Data Set Data1.Recordset = rs

4.2. Mediante ADO visualizando la informacin en un DataGrid Si utilizamos la biblioteca Microsoft ActiveX Data Object, hay que especificar en la cadena de conexin la ruta de la carpeta que contiene el archivo de texto y el tipo del ISAM que se va a utilizar, mediante la propiedad Extended Properties del objeto Connection. Tenga en cuenta que la versin del proveedor necesaria que hay que utilizar para abrir un archivo de texto mediante la biblioteca de ADO es la versin del proveedor Jet 4.0; el proveedor Jet 3.51 no soporta los drivers ISAM de Jet. Si se especifica el proveedor Jet 3.51, en tiempo de ejecucin se recibir el siguiente mensaje de error: No se pudo encontrar el ISAM instalable. Para descargar las distintas versiones de los componentes de acceso a datos de Microsoft (MDAC), visite la siguiente direccin: http://www.microsoft.com/data. El siguiente ejemplo, abre el anterior archivo utilizando el ISAM de texto del proveedor de datos Microsoft Jet: Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset ' Establezco la cadena de conexin con el archivo de texto Set cnn = New ADODB.Connection With cnn .Provider="Microsoft.Jet.OLEDB.4.0" .ConnectionString="Data Source=C:\Mis documentos;" & _ "Extended Properties=TEXT;" ' Abro la conexin .Open End With ' Abro el recordset Set rs = New ADODB.Recordset With rs ' Utilizamos cursores del lado cliente, para poder ' visualizar los datos en el control DataGrid .CursorLocation = adUseClient .CursorType = adOpenStatic .LockType = adLockOptimistic End With ' Ntese que hay que indicar la extensin del archivo, de lo ' contrario, el proveedor nos devolver un error. rs.Open "Clientes.txt", cnn, , , adCmdTable ' Relleno el control DataGrid Set DataGrid1.DataSource = rs Por ltimo indicar que el punto que separa el nombre del archivo de su extensin, se puede sustituir por el smbolo #:

Open "Clientes#txt", cnn, , adCmdTable Si no deseamos crear un archivo de informacin de esquema, bien en la cadena de conexin, bien en la consulta SQL, aparte de indicar el ISAM de texto y la ruta de la carpeta, tambin podemos indicar los valores que se especifican en la siguiente tabla, aunque no podremos aprovechar todas las restantes opciones que se pueden especificar en el archivo Schema.ini: HDR = Yes | No CharacterSet = ANSI | OEM | Unicode FMT = Delimited Indica si la primera fila contiene o no el nombre de los campos. El juego de caracteres que se utilizar. Los campos estarn delimitados por el carcter especificado en el registro de Windows.

Es importante resaltar que, en lneas generales, estos valores surtirn efecto siempre y cuando no haya un archivo de informacin de esquema en la carpeta donde se encuentre el origen de datos, porque de lo contrario, el ISAM de texto no los tendr en cuenta, ya que prevalecer la configuracin existente en el archivo Schema.ini. Asimismo, de no existir el archivo de informacin, los valores de los parmetros que no se especifiquen en la cadena de conexin, se tomarn de los existentes en el registro de Windows. La cadena de conexin del ejemplo anterior, tambin se podra haber especificado de la siguiente manera: .ConnectionString = "Data Source=" & App.Path & ";" & _ "Extended Properties=""TEXT;HDR=No;FMT=Delimited;CharacterSet=ANSI;""" A diferencia del ejemplo anterior, obsrvese en ste ltimo ejemplo la utilizacin de los pares de comillas en color rojo, ya que de no indicarse, nos encontraremos con el molesto mensaje de error No se pudo encontrar el archivo ISAM instalable. Igualmente, hay que tener precaucin en no separar con un espacio en blanco el signo de igualacin (=) que sigue a continuacin del nombre de la propiedad Extended Properties, para especificar el valor de sta, ya que obtendremos otro mensaje de error, en este caso, El formato de la cadena de inicializacin no cumple la especificacin OLE DB , un sutil error que nos puede costar perder cierto tiempo en intentar descubrir su origen. Si no deseamos tener problemas con las comillas dobles o los espacios en blanco a la hora de especificar los diferentes parmetros que conforman la cadena de conexin, podemos olvidarnos de la propiedad ConnectionString y asignar explcitamente los valores de las distintas propiedades de la siguiente manera: cnn.Properties("Data Source") = App.Path cnn.Properties("Extended Properties") = "TEXT;HDR=No;FMT=Delimited;CharacterSet=ANSI;"

4.3. Mediante ADO utilizando el driver de texto ODBC Tambin podemos utilizar la biblioteca de ADO junto con el driver ODBC de Texto para trabajar con los datos de nuestro archivo de texto. En ste caso, con tan slo especificar en la cadena de conexin el nombre del conductor y el directorio donde se encuentra nuestro archivo, estaremos en condiciones ptimas de manipular el origen de datos. objCnn.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ "DBQ=C:\Mis documentos" En lugar de indicar la palabra clave DBQ, tambin podemos especificar la palabra DefaultDir, la cual indicar el directorio por defecto, pero hay que tener en cuenta que, de no especificar ninguna de las dos palabras claves, el controlador ODBC de Texto se conectar al directorio actual que est establecido como tal en el sistema operativo. Es importante resaltar que los fallos en la conversin de tipos de campos especificados en el archivo Schema.ini tienen como resultado que se aplique un valor NULL a la columna afectada. El siguiente ejemplo utiliza el driver ODBC de texto para devolver el nmero de registros de la tabla Clientes cuyo archivo de texto se encuentra en la carpeta que contiene nuestra aplicacin: Dim cnnText As ADODB.Connection Dim rs As ADODB.Recordset ' Conexin con el archivo mediante el ' conductor (driver) ODBC para Texto Set cnnText = New ADODB.Connection With cnnText .Provider = "MSDASQL.1" .ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ "DBQ=" & App.Path & _ ";Extensions=txt,csv,tab,asc;" .Open End With ' Abrimos el objeto Recordset Set rs = New ADODB.Recordset rs.Open "SELECT COUNT (*) FROM Clientes.txt", cnnText, , , adCmdText ' Comprobamos el nmero de registros devueltos MsgBox rs.Fields(0) 4.4. Utilizando ASP con un origen de datos (DSN) Aparte de abrir un archivo de texto que est disponible en alguna carpeta de nuestro ordenador, tambin podemos establecer una conexin con un archivo que est disponible en un servidor, utilizando para ello un nombre de origen de datos (DSN). Aunque podemos crear cualquier origen de datos mediante el Administrador de orgenes de

datos ODBC del Panel de Control, en sta ocasin vamos a crear directamente un nombre de origen de datos para abrirlo mediante una pgina ASP, por tanto, es necesario que tengamos instalado e iniciado en nuestro ordenador los Servicios de Internet Information Server (IIS), y que guardemos el texto de ms abajo con el nombre Text.dsn, por ejemplo, en un directorio virtual con permisos para ejecutar scripts. [ODBC] DRIVER=Microsoft Text Driver (*.txt; *.csv) UID=admin UserCommitSync=Yes Threads=3 SafeTransactions=0 PageTimeout=5 MaxScanRows=25 MaxBufferSize=512 ImplicitCommitSync=Yes FIL=text Extensions=txt,csv,tab,asc DriverId=27 A continuacin, guardar en el mismo directorio virtual los datos del archivo de texto, creando para ello un nuevo archivo con el nombre Datos.txt: IdCliente;Nombre;Total 4300012;"Felipe Serrano Hervs";4250,37 4302015;"Gustavo Prez Garca";7585,59 4303025;"Joaqun Lpez Fernndez";141,53 4305684;"Mara Carmen Castilla Lombardo";1485,77 4300054;"Juan Carlos Armenteros Ruiz";7835,58 Por ltimo, slo nos queda crear el archivo EjemploDSNTexto.asp, por ejemplo, para ejecutar el cdigo Visual Basic Script: <% Option Explicit Response.Expires = -1000 Response.Write("<p><b><u><font size=3 face=arial>") Response.Write("Ejemplo de ASP</u></b></font></p>") Response.Write("<p><b><font size=2 face=arial>") Response.Write("Abrir un archivo de texto mediante un origen de datos DSN</b></font></p>") Dim Dim Dim Dim sDSNFile, sScriptDir sPath, sDSN sSQL, sColor cnn, rs

' Nombre del archivo DSN sDSNFile = "Text.dsn" ' Recuperamos el directorio actual

sScriptDir sScriptDir sScriptDir sScriptDir

= = = =

Request.ServerVariables("SCRIPT_NAME") StrReverse(sScriptDir) Mid(sScriptDir, InStr(1, sScriptDir, "/")) StrReverse(sScriptDir)

' Construimos dinmicamente el origen de datos DSN sPath = Server.MapPath(sScriptDir) & "\" sDSN = "FileDSN=" & sPath & sDSNFile & _ ";DefaultDir=" & sPath & _ ";DBQ=" & sPath & ";" ' Establecemos la conexin Set cnn = Server.CreateObject("ADODB.Connection") cnn.Open sDSN ' Construimos la consulta SQL de seleccin sSQL = "SELECT * FROM datos.txt ORDER BY IdCliente" ' Creamos un objeto Recordset con el resultado ' de la consulta Set rs = cnn.execute(sSQL) ' Mostramos el contenido del Recordset Response.Write("<table style='font-family:arial; font-size:10pt;'>") Response.Write("<tr bgcolor=black style='color:white;'><td>Id Cliente</td>") Response.Write("<td>Nombre</td>") Response.Write("<td align=right>Total Ventas</td>") sColor = "aqua" Do While NOT rs.EOF If sColor = "pink" Then sColor = "aqua" Else sColor = "pink" End If Response.Write("<tr bgcolor='" & sColor & "'>") Response.Write("<td>" & rs("IdCliente").Value & "</td>") Response.Write("<td>" & rs("Nombre").Value & "</td>") Response.Write("<td align=right>" & rs("Total").Value & "</td>") rs.MoveNext Loop ' Cerramos el Recordset y la Conexin rs.close Set rs = nothing cnn.close Set cnn = nothing %> Si ejecutis la pgina desde vuestro navegador, obtendris la siguiente tabla de datos:

Ejemplo de ASP
Abrir un archivo de texto mediante un origen de datos DSN Id Nombre Cliente 4300012 Felipe Serrano Hervs 4300054 Juan Carlos Armenteros Ruiz 4302015 Gustavo Prez Garca 4303025 Joaqun Lpez Fernndez Mara Carmen Castilla 4305684 Lombardo Total Ventas 4250,37 7835,58 7585,59 141,53 1485,77

5. Vinculacin de archivos de texto Al igual que vinculamos tablas de bases de datos Access, tambin podemos vincular a nuestra base de datos un archivo de texto delimitado. Sin embargo, para que el motor de base de datos Microsoft Jet puede uilizar la informacin del archivo Schema.ini, deben residir en la misma carpeta el archivo de datos y el archivo de informacin de esquema. Al igual que sucede cuando abrimos directamente un archivo de texto, cuando vinculamos un archivo de texto el ISAM de Microsoft Jet slo nos permitir aadir nuevos registros al archivo de texto, por lo que no podremos modificar ni eliminar datos del archivo de texto, ya que obtendremos el siguiente mensaje de error: Este ISAM no admite la actualizacin/eliminacin de datos en una tabla vinculada. 5.1. Vincular con ADOX un archivo de texto a una base de datos Access La biblioteca de ADO no permite vincular un archivo de texto a una base de datos Access. Para ello tenemos que ayudarnos de la biblioteca Microsoft ADO Ext. 2.x for DLL and Security, ms conocida en los ambientes de programacin por el nombre de ADOX, la cual es una extensin de los objetos y del modelo de programacin de ADO. Por tanto, en nuestro proyecto no hay que olvidarse de hacer referencia a la citada biblioteca. El siguiente ejemplo, muestra como vincular un archivo de texto, a una base de datos Access 2000: Public Sub LinkTextWithADO Dim cnn As ADODB.Connection Dim cat As ADOX.Catalog Dim tbl As ADOX.Table ' Establezco la conexin con la base de datos Access Set cnn = New ADODB.Connection With cnn .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Mis documentos\Bd1.mdb;"

.Open End With ' Creo un nuevo catlogo Set cat = New ADOX.Catalog cat.ActiveConnection = cnn ' Creo la nueva tabla Set tbl = New ADOX.Table tbl.Name = "Tabla Vinculada de Texto" Set tbl.ParentCatalog = cat ' Establezco las propiedades para crear el vnculo With tbl .Properties("Jet OLEDB:Create Link") = True .Properties("Jet OLEDB:Link Provider String") = "TEXT;DATABASE=" & _ App.Path & ";HDR=Yes;FMT=Delimited" .Properties("Jet OLEDB:Remote Table Name") = "Clientes#txt" End With ' Aado la tabla a la coleccin 'Tables' cat.Tables.Append tbl End Sub 5.2. Utilizar DAO para vincular un archivo de texto Para vincular un archivo de texto delimitado a una base de datos Access, hay que utilizar el mtodo OpenDatabase para abrir la base de datos; crear un objeto TableDef, y establecer las propiedades Connect y SourceTableName del objeto TableDef para indicar el archivo de texto que se desea vincular. En el siguiente ejemplo, vamos a vincular un archivo de texto de longitud fija, por lo que necesitaremos crear un archivo de informacin de esquema Schema.ini, en la misma carpeta donde se encuentren los datos, para especificar el nmero, nombre, tipo de dato y ancho de las columnas. En ste caso, indicaremos que la primera fila no contiene los nombres de los campos. El archivo de configuracin de esquema sera as: [Clientes fijo.txt] ColNameHeader=False CharacterSet=ANSI Format=FixedLength Col1=IdCliente Long Width 7 Col2=Nombre Text Width 35 Col3=CIF Text Width 9 El archivo Clientes fijo.txt estar compuesto por los siguientes cinco registros. Si desea probar el ejemplo, copie y pegue los datos con el mismo formato en el que aparecen aqu: 430001 CAADA VAZQUEZ, JOAQUIN 430002 MENDEZ CUBILLO, LORENZO 430006 CONSTRUCCIONES EL BUENO, S.A. 12111255B 58777000 A33366684

430012 MENDIETA GARCA, FELIPE 430015 CARRILLO CONTRERAS, ROSARIO

06254000A 55666555Z

Ya slo nos queda, ejecutar el siguiente procedimiento: Public Sub LinkTextWithDAO Dim db As Database Dim td As TableDef ' Abro la base de datos de Access Set db = OpenDatabase("C:\Mis documentos\Bd1.mdb") ' Creo un objeto TableDef Set td = db.CreateTableDef("Tabla de Texto Fijo vinculada") ' Establezco la informacin de conexin td.Connect = "TEXT;DATABASE=" & App.Path td.SourceTableName = "Clientes fijo#txt" ' Anexo el objeto TableDef para crear el vnculo db.TableDefs.Append td End Sub Si abrimos la tabla vinculada en nuestra base de datos Access, observaremos el siguiente resultado: IdCliente Nombre CIF 430001 CAADA VAZQUEZ, JOAQUIN 12111255B 430002 MENDEZ CUBILLO, LORENZO 58777000 430006 CONSTRUCCIONES EL BUENO, S.A. A33366684 430012 MENDIETA GARCA, FELIPE 06254000A 430015 CARRILLO CONTRERAS, ROSARIO 55666555Z

6. Cmo crear y eliminar una tabla de texto Mediante la instruccin CREATE TABLE correspondiente al Lenguaje de Definicin de Datos (DDL) de SQL, podemos crear una tabla de texto de la misma forma que crearamos una tabla en una base de datos Access. Es ms, utilizando dicho comando, automticamente se generar el archivo de informacin de esquema Schema.ini correspondiente, y en la misma carpeta donde hayamos creado el archivo de texto. De querer crear un archivo de texto delimitado, en mi opinin es la forma ms fcil de generar el archivo Schema.ini, porque en principio, los parmetros del mismo sern los que aparezcan en el registro de windows. Por el contrario, si deseamos crear un archivo de texto de longitud fija, necesitaremos crear de antemano el archivo Schema.ini para especificar el ancho de las columnas.

La sintaxis de la instruccin CREATE TABLE es la siguiente: CREATE TABLE Nombre_Tabla (Campo1 Tipo (tamao), Campo2 Tipo (tamao), ...) A continuacin vamos a generar un archivo de texto de tres campos, utilizando la biblioteca de ADO: Dim cnn As ADODB.Connection ' Establecemos la conexin Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & App.Path .Properties("Extended Properties") = "TEXT;" .Open End With ' Creamos la tabla de texto cnn.Execute "CREATE TABLE Clientes#txt (IdCliente LONG, " & _ "Apellidos TEXT (50), Nombre TEXT (25))" Si vamos a la carpeta que contiene nuestra aplicacin, podemos observar que se ha generado el archivo de texto donde slo aparecen los nombres de los campos en la primera fila. Asimismo, tambin podemos observar que se ha creado el archivo de informacin de esquema con los valores de los parmetros existentes en el registro de nuestro sistema. Si utilizamos la biblioteca de DAO, el cdigo sera el siguiente: Dim db As Database ' Abrimos la base de datos Set db = OpenDatabase(App.Path, True, False, "TEXT;") ' Creamos la tabla de texto db.Execute "CREATE TABLE Clientes#txt (IdCliente LONG, " & _ "Apellidos TEXT (50), Nombre TEXT (25))" En cuanto a cmo eliminar un archivo de texto, lo ms fcil sera eliminarlo desde el Administrador de Archivos, o utilizar la instruccin Kill de Visual Basic, pero ya que estamos utilizando bibliotecas de acceso a datos, vamos a eliminarlo como eliminaramos cualquier otra tabla de una base de datos Access. Mediante ADO y DAO utilizaramos el mtodo Execute de un objeto Connection o Database, respectivamente, para ejecutar la siguiente consulta SQL: objeto.Execute "DROP TABLE Clientes#txt" Para los usuarios de DAO, comentar que tambin pueden eliminar el archivo de texto utilizando el mtodo Delete de la coleccin TableDefs de un objeto Database previamente

abierto: db.TableDefs.Delete "Clientes#txt" Tal es la vinculacin existente entre el archivo de texto y su archivo de informacin de esquema, que al eliminar el archivo de texto, automticamente tambin se elimina el archivo de informacin de esquema asociado, o la seccin correspondiente al archivo eliminado, si el archivo Schema.ini tiene informacin de varios archivos de texto. Esta es la ventaja que tiene utilizar los mtodos de eliminacin expuestos en contraposicin a utilizar la instruccin Kill.

7. Importar los datos de un archivo de texto La verdadera importancia de los distintos formatos de ISAM del que dispone el motor Microsoft Jet, reside en la capacidad que ostenta para importar/exportar datos a distintos orgenes de datos, utilizando para ello el potente Lenguaje de Consulta Estructurado (SQL). De sta manera podemos utilizar los datos de un simple archivo de texto para importarlo a una base de datos Access, a una hoja de clculo Excel, o a otros tipos de base de datos de escritorio como bien puede ser, dBASE o Paradox, entre otros. Esto es posible gracias a una variacin de la instruccin SELECT, la cual nos permitir crear una nueva tabla con los registros devueltos de la consulta, simplemente con agregar la clusula INTO a la misma. De igual manera, para identificar el archivo de texto externo, incluiremos la clusula IN para especificar el tipo de ISAM que vamos a utilizar (en nuestro caso TEXT;), y la ruta donde se encuentra la base de datos externa (el parmetro DATABASE). En general, la sintaxis de la consulta de creacin de tabla es la siguiente, dependiendo de la tabla que deseemos identificar. Para identificar una tabla de destino: SELECT * INTO [Tabla destino] IN {ruta | ["ruta" "tipo ISAM"] | ["" [tipo ISAM; DATABASE = ruta]]} SELECT * INTO [Nueva Tabla] IN ["C:\Mis documentos" "TEXT;"] FROM [Tabla Origen] SELECT * INTO [Nueva Tabla] IN [''TEXT; DATABASE=C:\Mis documentos] FROM [Tabla Origen] Para identificar una tabla de origen: FROM [Tabla origen] IN {ruta | ["ruta" "tipo ISAM"] | ["" [tipo ISAM; DATABASE = ruta]]} SELECT * INTO [Nueva Tabla] FROM [Tabla Origen] IN ["C:\Mis documentos" "TEXT;"] SELECT * INTO [Nueva Tabla] FROM [Tabla Origen] IN [''TEXT; DATABASE=C:\Mis documentos"]

7.1. Importar los datos a una base de Access Si tenemos una conexin abierta con una base de datos Access, podemos importar los datos de un archivo de texto creando una nueva tabla en nuestra base de datos. En ste caso, la tabla que necesitamos identificar es la tabla de origen, que corresponder con el archivo de texto cuyos datos queremos recuperar. A continuacin, y mediante la biblioteca de ADO, vamos a crear una nueva tabla [TextImport] en nuestra base de datos Access, con los datos del archivo de texto [Clientes#txt]. Para utilizar el ejemplo con la biblioteca de DAO, simplemente necesitar ejecutar la misma consulta SQL con el mtodo Execute de un objeto Database previamente abierto: Dim cnn As ADODB.Connection Dim sTablaOrigen As String ' Establezco la conexin con la base de datos actual Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Mis documentos\bd1.mdb" .Open ' Identificamos la tabla de origen. Obsrvese en rojo la ' utilizacin de las comillas simples sTablaOrigen = " ''[TEXT; DATABASE=" & App.Path & "]" ' Tambin podemos utilizar la siguiente sintaxis ' sTablaOrigen = " '" & App.Path & "' 'TEXT;'" ' Importamos los datos, creando una nueva tabla .Execute "SELECT * INTO TextImport FROM [Clientes#txt] IN " & sTablaOrigen ' Cerramos la conexin .Close End With Nota importante: Pongo especial nfasis en las comillas simples para que el lector observe correctamente la sintaxis utilizada, ya que es sumamente importante incluirlas para delimitar la ruta de acceso al archivo y la versin del ISAM instalable que se va a utilizar, procurando dejar un espacio en blanco entre ambos parmetros. Es de suma importancia tener en cuenta que, si el delimitador de campos del archivo de texto no coincide con el especificado por defecto en el registro de Windows, necesariamente tendremos que especificarlo en la opcin Format del archivo de informacin de esquema Schema.ini, a fin de que todos los campos se importen correstamente, porque de lo contrario, slo se importar el primer campo, y tampoco lo har de forma idnea. 7.2. Importar los datos a una hoja de clculo Excel En el siguiente ejemplo, vamos a utilizar nuestro archivo de texto para importar los datos a un libro de trabajo de Excel, creando de sta manera, una nueva hoja de clculo. Vuelvo

hacer hincapi en la necesidad de tener un archivo de informacin de esquema para que los datos se exporten correctamente. Es ms, si la primera fila del archivo de texto no contiene el nombre de los campos, necesariamente tendremos que establecer a False el valor del parmetro ColNameHeader del archivo Schema.ini si queremos que se recupere la primera fila como un registro ms. Dim sTablaOrigen As String, sChainSql As String Dim cnn As ADODB.Connection ' Establezco la conexin con el libro de trabajo Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Mis documentos\Libro1.xls;" .Properties("Extended Properties") = "Excel 8.0;" .Open End With ' Construimos la consulta SQL sTablaOrigen = " '" & App.Path & "' 'TEXT;' " sChainSql = "SELECT * INTO TextImport FROM [Clientes#txt] IN " & sTablaOrigen ' Creamos una hoja de clculo en el libro de Excel cnn.Execute sChainSql ' Cierro la conexin cnn.Close 7.3. Importar los datos a otro archivo de texto Tambin nos puede interesar crear otro archivo de texto delimitado para, por ejemplo, modificar el carcter delimitador de los campos, o cualquier otro parmetro, de un archivo de texto ya existente, por lo que necesariamente tendremos que crear un archivo Schema.ini para indicar el nuevo valor que deseamos obtener en el parmetro apropiado. En sta ocasin, vamos a utilizar la biblioteca de DAO: Dim sTablaOrigen As String, sChainSql As String Dim db As Database ' Establezco la conexin con el archivo de texto ' que deseamos crear, especificando la ruta y ' el tipo de ISAM Set db = OpenDatabase(App.Path, True, False, "TEXT;HDR=Yes;FMT=Delimited;") ' Construimos la consulta SQL sTablaOrigen = " ''[TEXT; DATABASE=" & App.Path & "]" sChainSql = "SELECT * INTO [TextImport#txt] FROM [Clientes#txt] IN " & sTablaOrigen ' Creamos el nuevo archivo de texto db.Execute sChainSql ' Cierro la conexin

db.Close A diferencia de los ejemplos anteriores, en ste quiero hacer la salvedad de que necesariamente tendremos que especificar una extensin para el nuevo archivo de texto, utilizando para ello un punto (.), o el smbolo #, de tal forma que quede bien definido el nombre y la extensin del archivo. Y esto es as porque de no especificar la extensin obtendremos el mensaje de error: No se puede actualizar. Base de datos u objeto de slo lectura. Un error que nos puede acarrear un verdadero dolor de cabeza si no ponemos especial cuidado en especificar la extensin del nuevo archivo de texto. Para ms informacin sobre el tema, puede consultar el sigiente artculo de Microsoft Knowledge Base: Mensaje de error "No se puede actualizar. Base de datos u objeto de slo lectura" cuando importa o exporta archivos

8. Cmo exportar datos desde el propio archivo de texto Al igual que hemos utilizado una consulta SQL de creacin de tabla para importar los datos de un archivo de texto, creando para ello una conexin con otro origen de datos distinto, ahora se trata de exportar los datos desde el propio archivo de texto, es decir, abriendo una conexin con ste ltimo y exportando desde aqu los datos a una base de datos Access, por ejemplo. En ste caso, necesitaremos identificar la tabla de destino, la cul se corresponder con el archivo de texto que deseamos crear. Vase la sintaxis de la instruccin SELECT * INTO descrita en el punto nmero siete. Mediante ADO, vamos a crear una tabla en nuestra base de datos Access, con los datos de un archivo de texto delimtado: Dim cnn As ADODB.Connection Dim sConnect As String ' Establezco la conexin con el archivo de texto Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & App.Path & _ ";Extended Properties=""TEXT;""" .Open ' Indicamos la ruta de la base de datos sConnect = "'C:\Mis documentos\Bd1.mdb'" ' Creamos la tabla .Execute "SELECT * INTO [TextExport] IN " & sConnect & " FROM [Clientes#txt]" .Close End With Si en la propiedad Extended Properties no se desea escribir tantos pares de comillas

dobles, se puede hacer referencia al tipo de ISAM de la siguiente manera: cnn.Properties("Extended Properties") = "TEXT;" A continuacin, vamos a generar un archivo dBASE con los datos de nuestro archivo de texto, utilizando sta vez, la biblioteca de DAO. Indicar que, si el nombre del archivo de dBASE es superior a ocho caracteres, no se tendrn en cuenta los caracteres que excedan de dicho nmero. Dim db As Database Dim sConnect As String ' Establezco la conexin con el archivo de texto ' que deseamos crear, especificando la ruta y ' el tipo de ISAM Set db = OpenDatabase(App.Path, True, False, "TEXT;HDR=Yes;FMT=Delimited;") ' Construimos la consulta SQL para identificar la tabla de destino ' Obsrvese las comillas simples en rojo sConnect = " ''[dBASE 5.0; DATABASE=" & App.Path & "]" ' Creamos el nuevo archivo de dBASE, cuyo nombre tiene ms de ocho caracteres db.Execute "SELECT * INTO [TextExport#dbf] IN " & sConnect & " FROM [Clientes#txt]" ' Cierro la conexin db.Close

9. Cmo exportar datos a un archivo de texto La manera ms fcil de crear un archivo de texto delimitado con los datos procedentes de tablas u otros orgenes de datos, es mediante la utilizacin de una consulta SQL de creacin de tabla. Simplemente necesitaremos establecer una conexin con el origen de datos, y exportar la tabla especificando el tipo de ISAM que vamos a utilizar y la ruta donde se crear el archivo de texto. Si al exportar los datos no disponemos de la informacin del archivo de configuracin de esquema Schema.ini, automticamente se generar uno en la misma carpeta donde se haya creado el archivo de texto, el cual contiene los valores por defecto establecidos en el registro de Windows. Si necesitamos especificar o modificar algn valor, necesariamente tenemos que generar un archivo Schema.ini antes de ejecutar la consulta. Debemos de tener especial cuidado en no olvidarnos de especificar la extensin del archivo de texto, ya que de lo contrario obtendremos el mensaje de error: No se puede actualizar. Base de datos u objeto de slo lectura. 9.1. Exportar los datos de una tabla de Access El ejemplo mostrar cmo exportar mediante la biblioteca de ADO una tabla de Access,

creando un archivo de texto delimitado: Dim cnn As ADODB.Connection Dim sConnect As String ' Establezco la conexin con la base de datos actual Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=C:\Mis documentos\bd1.mdb" .Open ' Indico el tipo de ISAM y la ruta del archivo de texto sConnect = "[TEXT;DATABASE=" & App.Path & "].[TextExport#txt]" ' Exportamos la tabla .Execute "SELECT * INTO " & sConnect & " FROM Clientes" ' Cierro la conexin .Close End With 9.2. Exportar los datos de una hoja de clculo Excel En sta ocasin, el ejemplo ilustra cmo exportar desde Excel una hoja de clculo, creando un archivo de texto delimitado, utilizando para ello la biblioteca de DAO. Al igual que utilizamos Excel como origen de datos, tambin podemos especificar otro tipo de ISAM disponible en nuestro sistema: Dim sConnect As String Dim db As Database ' Establezco la conexin con el libro de trabajo Set db = OpenDatabase("C:\Mis documentos\Libro1.xls", False, False, "Excel 8.0; HDR=Yes;") ' Indico el tipo de ISAM y la ruta del archivo de texto sConnect = "[TEXT; DATABASE=" & App.Path & "].[TextExport#txt]" ' Exportamos la hoja de clculo db.Execute "SELECT * INTO " & sConnect & " FROM [Hoja1$]" ' Cierro la base de datos db.Close

10. Aadir registros a una tabla procedentes de un archivo de texto delimitado Si tenemos una tabla creada en Access y queremos aadir los datos existentes en un archivo de texto delimitado, podemos insertar los datos mediante la instruccin INSERT

INTO, lo que en SQL se conoce como una consulta de datos aadidos o anexados, la cual aade los nuevos registros al final de la tabla o consulta ya existente. En las tablas origen y destino puede especificar una tabla o una consulta. Si especifica una consulta, el motor de base de datos Microsoft Jet aade los registros a cualquiera y a todas las tablas especificadas en la consulta. Si la tabla de destino contiene una clave principal, hay que asegurarse de que se aade un valor nico y distinto de Null al campo o campos de la clave principal; de lo contrario, el motor de base de datos no aadir los registros. Tambin hay que tener en cuenta que, si aade registros a una tabla con un campo de tipo AutoNumrico y desea volver a numerar los registros aadidos, no incluya el campo contador en la consulta. Incluya el campo Autonumrico en la consulta slo si desea conservar los valores originales del campo. Por ltimo recalcar que, si la tabla o consulta no existe en la base de datos de Access, no se podr aadir registros, debido a la inexistencia de la misma, cosa que por otra parte, es bastante lgica. 10.1. Desde la propia base de datos Access activa Si tenemos una conexin abierta con una base de datos Access, que ya contiene la tabla o consulta donde queremos aadir los registros del archivo de texto, solamente tendramos que especificar la versin del ISAM a utilizar, el parmetro HDR y la ruta del archivo de texto en el parmetro DATABASE. El siguiente ejemplo muestra como insertar un conjunto de registros en una tabla existente de Access mediante la biblioteca de ADO. El ejemplo parte de la premisa de la no existencia de un archivo de configuracin Schema.ini, por lo que necesariamente tendremos que especificar en el parmetro HDR que la primera fila del archivo de texto contiene el nombre de los campos: Dim cnn As ADODB.Connection Dim sConnect As String, sSQL As String sConnect = "[TEXT; HDR=Yes; DATABASE=" & App.Path & "].[Clientes#txt]" ' Construimos la consulta SQL sSQL = "INSERT INTO TBClientes SELECT * FROM " & sConnect ' Conexin con tu base de datos Accesss Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0;" .ConnectionString = "Data Source=C:\Mis documentos\Bd1.mdb" .Open ' Aadimos los registros .Execute sSQL, , adCmdText ' Cerramos la conexin

.Close End With De no existir un archivo Schema.ini, el ISAM no puede conocer de antemano el nombre de las columnas, por lo que la primera fila de nuestro archivo de texto necesariamente deber de contener los nombres de los campos, y stos debern de coincidir, y en el mismo orden, con los nombre de los campos de la tabla. En este supuesto, el parmetro HDR cobra especial relevancia, porque de especificar el valor No, podramos tener problemas al aadir los registros, debido a que el motor Jet no sabra dnde insertar los mismos. 10.2. Desde el propio archivo de texto activo Al contrario que en el punto anterior, a continuacin voy a mostrar cmo se aadiran los registros en la tabla de Access, pero desde una conexin con el archivo de texto, de esta forma se observar la utilizacin de la clusula IN de SQL, la cual identifica las tablas de cualquier base de datos externa a la que el motor de base de datos Microsoft Jet se puede conectar, en ste caso identificamos la tabla de destino, que se corresponder con una tabla de la base de datos de Access. El turno ahora es para la biblioteca de DAO: Dim sConnect As String, sChainSQL As String Dim db As Database ' Establezco la conexin con el archivo de texto ' que deseamos crear, especificando la ruta y ' el tipo de ISAM Set db = OpenDatabase(App.Path, True, False, "TEXT; HDR=Yes; FMT=Delimited;") ' Indicamos la ruta de la base de datos Access sConnect = " 'C:\Mis documentos\Bd1.mdb' " ' Construimos la consulta SQL sChainSQL = "INSERT INTO TBClientes IN " & sConnect & " SELECT * FROM [Clientes#txt]" ' Insertamos los nuevos registros db.Execute sChainSQL ' Cierro la conexin db.Close

11. Aadir nuevos registros a nuestro archivo de texto Siguiendo con las posibilidades que nos brinda el Lenguje de Consulta Estructurado (SQL), vamos a ver cmo insertar nuevos registros en un archivo de texto delimitado. Esto es til para cuando tengamos un archivo de texto vaco, con su correspondiente archivo de informacin de esquema Schema.ini creado, y debidamente configurado a nuestras necesidades, y necesitemos trabajar con los datos en el propio archivo de texto, o bien, para intercambiar la informacin entre los distintos sistemas de gestin de bases de

datos existentes en el mercado. En el supuesto que nos ocupa, es necesario que el archivo de texto exista previamente en la carpeta especificada, y que la primera fila contenga el nombre de los campos y estn en el mismo orden que los campos del archivo o tabla cuyos registros vamos a insertar en nuestro archivo de texto. Igualmente, y a fin de evitar el oportuno error, si en la conexin con la base de datos externa se especifica el parmetro HDR, ste necesariamente tendr que ser True, ya que de nada sirve que establezcamos a True/False el parmetro ColNameHeader en el archivo de informacin de esquema Schema.ini. Por supuesto, de no especificar el parmetro HDR, habr de asegurarse que el valor FirstRowHasNames de la clave del registro de Windows HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text, est establecido a 01, porque de lo contrario, necesariamente tendremos que especificar el parmetro HDR=Yes. 11.1. Desde un archivo de dBASE activo El utilizar un archivo dBASE, simplemente es para que el lector observe la capacidad de la que dispone los distintos tipos de ISAM que incluye el motor de base de datos Microsoft Jet, por lo que prcticamente podemos intercambiar informacin entre diferentes tipos de orgenes de datos. A continuacin, y mediante la biblioteca de ADO, vamos a establecer una conexin con un archivo dBASE, e insertar los registros devueltos por una consulta SQL, en nuestro archivo de texto: Dim sConnect As String, sChainSql As String Dim cnn As ADODB.Connection ' Establecemos la conexin con el archivo de dBASE, ' que ser la conexin activa Set cnn = New ADODB.Connection With cnn .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source = " & App.Path .Properties("Extended Properties") = "dBASE 5.0;" .Open End With ' Identificamos la tabla de destino, que ser el nombre de nuestro archivo de texto ' Obsrvese el par de comillas simples en rojo sConnect = " ''[TEXT; HDR=Yes; DATABASE=" & App.Path & "]" ' Construimos la consulta SQL sChainSql = "INSERT INTO [Clientes#txt] IN " & sConnect & " SELECT * FROM [Clientes#dbf]" ' Insertamos los registros cnn.Execute sChainSql, , adCmdText ' Cerramos la conexin cnn.Close

11.2. Desde el propio archivo de texto activo A diferencia del ejemplo anterior, a continuacin vamos a insertar los registros en el archivo de texto, pero desde una conexin con ste ltimo, por tanto, mientras que en el ejemplo anterior identificbamos la tabla de destino, en ste identificaremos la tabla de origen, que se corresponder con el archivo dBASE. Mediante la biblioteca de DAO seria de la siguiente manera: Dim sConnect As String, sChainSql As String Dim db As Database ' Establezco la conexin con el archivo de texto, ' especificando la ruta y el tipo de ISAM Set db = OpenDatabase(App.Path, True, False, "TEXT; HDR=Yes; FMT=Delimited;") ' Identificamos la tabla de origen, que ser la ' ruta del archivo dBASE sConnect = " ''[dBASE 5.0; DATABASE=" & App.Path & "]" ' Construimos la consulta SQL sChainSql = "INSERT INTO [Clientes8#txt] SELECT * FROM [Clientes#dbf] IN " & sConnect ' Insertamos los nuevos registros db.Execute sChainSql ' Cerramos la conexin db.Close

12. Algunos artculos tiles de Microsoft Knowledge Base La siguiente relacin de enlaces a Microsoft Knowledge Base que cito (por no decir todos), estn en ingls. He traducido los ttulos de los artculos a fin de facilitar al usuario hispanohablante una referencia ms rpida al contenido de los mismos. En dichos artculos el usuario podr ampliar la informacin contenida en ste artculo sobre cmo manipular los datos contenidos en un archivo de texto mediante el ISAM de Texto del motor Microsoft Jet. Los artculos estn ordenados de mayor a menor antigedad en la fecha de su ltima actualizacin. Artculo Tipo 550166 146220 PRB 190186 ACC 208404 234201 Descripcin Lectura de un fichero de texto con Schema.ini El driver de texto ODBC slo soporta la instruccin INSERT Error al actualizar un archivo de texto vinculado utilizando el Administrador de Tablas vinculadas ACC2000 Los campos de texto de longitud fija con caracteres de retorno incrustados son incorrectamente importados ACC2000 Utilizar SQL para exportar a Unicode mediante el proveedor Jet y el ISAM de texto

124657 239471 205439

INF

230265 262537 145769 210001 282263 199068 245407 254002

268264 326548 241477 210073 182354 182355 187670

El driver de texto necesita conocer el directorio para definir el formato permitido El ISAM Instalable de Texto Jet 4.0 le permite a los usuarios aadir lneas a los archivos de sistema PRB Los archivos de texto que utilizan delimitadores no estndar de texto no se analizan adecuadamente con el driver de texto de Microsoft El ejemplo ImportText.exe importa texto a Access mediante ADO, RDO, DAO, Filesys y Automatizacin HOWTO Abrir archivos de texto delimitado utilizando el IISAM de texto del proveedor Jet PRB La letra mayscula "S" no se muestra cuando se usa el ISAM de texto ACC2000 Cmo crear mediante programacin un archivo Schema.ini ACC2002 Ignorar el valor establecido de MaxScanRows puede provocar tipos de datos inadecuados en tablas vinculadas ACC2000 Error de Schema.ini con la accin TransferText durante la exportacin ACC2000 Mensaje de error "No se puede actualizar. Base de datos u objeto de slo lectura" cuando importa o exporta archivos FIX Importar un archivo de texto sin utilizar el archivo Schema.ini puede ocasionar que las columnas de texto se definan como Currency ACC2000 Error 3433 en tiempo de ejecucin cuando importa o exporta un archivo de texto HOW TO Utilizar Jet OLE DB Provider 4.0 para conectarse a bases de datos ISAM ACC2000 Error cuando intenta utilizar Schema.ini para importar o exportar con el mtodo TransferText ACC2000 Cmo utilizar un archivo Schema.ini para tener acceso a datos de texto PRB Jet Text IISAM Driver Drops Leading Spaces PRB El IISAM de texto Jet trunca los espacios arrastrados HOWTO Utilizar RDO y el driver de texto ODBC para abrir un archivo de texto delimitado

NOTA: El contenido de ste artculo es una recopilacin de las participaciones del autor en el grupo de noticias en espaol de Visual Basic (microsoft.public.es.vb), as como de la informacin disponible en los distintos artculos que la Microsoft Knowledge Base ofrece sobre el tema en cuestin, de los cuales se hace una referencia en el apartado nmero doce. La informacin contenida en este artculo, 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.

Вам также может понравиться