Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

importar un txt algo especial

40 views
Skip to first unread message

Jose Hidalgo

unread,
Nov 27, 2001, 12:38:38 PM11/27/01
to
Hola genios. Necesito importar una BD a una tabla Access, pero presenta
ciertas peculiaridades esta dichosa BD:

1º. Cada registro es un fichero .txt con nombres de fichero del tipo:
A001.txt, A002.txt, ... Z999.txt.

2º. El fichero no tiene caracteres de separación, sino que es más bien así:

Contenido del Fichero A001.txt:
====================
"Nombre

Hola a todos los chavales de aforo, este es un texto largo.

Y ahora vamos al tercer párrafo."

=====================

No tendría problema si por lo menos los 3 párrafos estuvieran en el mismo
reglón pero separados por el caracter punto y coma (;). El primer párrafo
es de tipo TEXTO y los otros 2 restantes son de tipo MEMO.

¿Existe algún método para corregir esto sin hacerlo a mano en los 3.735
ficheros?

¿Cómo puedo automatizar la importación de todos los ficheros de una sola
vez?.


Enviado desde http://access.aforo.com
¿Quieres el buscador de es.comp.bd.ms-access en tu web?
http://www.aforo.com/webmasters.asp


Jose Hidalgo

unread,
Nov 28, 2001, 10:34:04 AM11/28/01
to
Saludos a todo el foro de ACCESS. Bien, vamos a ver:

Mi problema para importar datos a una tabla de Access es el siguiente:

Tengo un directorio con 3.700 ficheros .txt. El contenido de cada fichero
debe corresponder con un registro en mi futura tabla ACCESS.

Esos ficheros tienen la siguiente estructura o forma:

"primer párrafo

segundo párrafo

tercer párrafo"

Cada párrafo es evidentemente un campo. Con lo cual, el resultado en
ACCESS seran 3 campos de tipo MEMO. Pero como veréis no están
separados los párrafos por punto y coma (;), sino por una línea en blanco
entre párrafo y párrafo con el ENTER.

Mi consulta es:

1. Como reestructurar los casi 4.000 ficheros de forma automática para
eliminar la linea vacía y añadir ";" entre párrafos sin tener que hacerlo a
mano uno por uno. ¿ALGUN FICHERO BAT?

2. Cuando tenga los 3.700 ficheros correctamente... ¿Cómo importarlos de
una sola vez a una tabla en ACCESS?.


Es importante. Hacerme cuantas sugerencias se os ocurran. Gracias a todos.

CarCar

unread,
Nov 28, 2001, 6:20:28 PM11/28/01
to
Hola:

Te coloco un procedimiento que hace lo que tú quieres.


Sub ImportarTexto2()
Dim X As Integer
Dim Xi As Integer
Dim Nom As String
Dim Path As String
Dim Rs As Recordset
Dim RsDef As Recordset
Dim Campo1 As String
Dim Campo2 As String
Dim Campo3 As String
'
' Incorporar todos los archivos en una tabla con un solo campo.
'
Path = "C:\Documents and Settings\Carcar\Mis documentos\Pruebas\"
Nom = Dir(Path)
Do While Len(Nom) > 0
DoCmd.TransferText , , "TablaImportada", Path & Nom
Nom = Dir
Loop
'
' Procesar registros grabados para tabla definitiva.
'
Set Rs = CurrentDb.OpenRecordset("TablaImportada", dbOpenSnapshot)
If Rs.RecordCount > 0 Then
Set RsDef = CurrentDb.OpenRecordset("TablaFinal",
dbOpenDynaset)
Do While Not Rs.EOF
Campo1 = ""
Campo2 = ""
Campo3 = ""
X = 1
Do While Asc(Mid(Rs!F1, X, 1)) > 30
Campo1 = Campo1 & Mid(Rs!F1, X, 1)
X = X + 1
Loop

Do While Asc(Mid(Rs!F1, X, 1)) <= 30
X = X + 1
Loop
Do While Asc(Mid(Rs!F1, X, 1)) > 30
Campo2 = Campo2 & Mid(Rs!F1, X, 1)
X = X + 1
Loop

Do While Asc(Mid(Rs!F1, X, 1)) <= 30
X = X + 1
Loop
Do While Asc(Mid(Rs!F1, X, 1)) > 30
Campo3 = Campo3 & Mid(Rs!F1, X, 1)
X = X + 1
If X > Len(Rs!F1) Then
Exit Do
End If
Loop

RsDef.AddNew
RsDef!Campo1 = Campo1
RsDef!Campo2 = Campo2
RsDef!Campo3 = Campo3
RsDef.Update
Rs.MoveNext
Loop
End If

Rs.Close
MsgBox "Fin"
End Sub

En la primera parte del procedimiento se importan los diversos
archivos en una tabla llamada "TablaImportada" que se crea sola, no
hace falta tenerla creada.

En la segunda parte se procesa el contenido de la misma, leyendo sus
registros y el único campo llamado "F1" y grabando los registros en
una tabla que SI QUE DEBES de tener CREADA, que en la función se llama
"TablaFinal" con 3 campos: "Campo1", "Campo2" y "Campo3" el primero
creado de tipo Texto y los dos siguientes Memo.

Espero que, con los ajustes necesarios te sirva el invento.

Saludos.


Jose Hidalgo <jose...@yahoo.es> wrote in message news:<9u0j2u$it5$1...@talia.mad.ttd.net>...

Jose Hidalgo

unread,
Nov 29, 2001, 8:32:35 AM11/29/01
to
Gracias CarCar, pero necesito que me hagas algunas indicaciones:

He creado un formulario con un botón al cual le he añadido un
procediminento de evento con tu función en "Al hacer Click".

Lo ejecuto, pulso el botón y me da error en la línea siguiente:

"Set Rs = CurrentDb.OpenRecordset("TablaImportada", dbOpenSnapshot)"

El error producido es el 3001 en tiempo de ejecución.

¿Lo estoy haciendo bien?. Si eres tan amable de guiarme...

CarCar

unread,
Nov 29, 2001, 6:24:18 PM11/29/01
to
Hola:

Tengo un problema con "pp" que es exactamente igual que el tuyo y
supongo que trabajas con Access 2000.

Desgraciadamente no dispongo de una versión completa de Access 2000 y
no dispongo de la ayuda, así que no sé si voy a poder ayudarte.

Este error lo solucinó "pp" incluyendo la referencia "Microsoft DAO
3.6 object library" para eso teniendo el módulo abierto (la ventana de
VB) vas al menú Herramientas -> Referencias y allí seleccionas (porque
no la tendrás) la Microsoft DAO.

Y prueba a ver que pasa.

Saludos.

PS: Los expertos en el 2000 que estén atentos, que no sé por dónde me
vienen los tiros. :-)

Jose Hidalgo <jose...@yahoo.es> wrote in message news:<9u5ddj$jqo$1...@talia.mad.ttd.net>...

Jose Hidalgo

unread,
Nov 30, 2001, 8:23:36 AM11/30/01
to
Efectivamente uso ACCESS 2000.

He seguido tus indicaciones (Microsoft DAO 3.6 object library) pero sigue
dandome error.

Creo la tabla "TablaFinal" = Campo1 (Texto), Campo2 y Campo3 (Memo).

Abro el formulario con el boton Importar Tablas que ejecuta el
procedimiento de evento tuyo:

Sub importar_Click()

Dim X As Integer
Dim Xi As Integer

.....
etcétera
.....

End Sub"

Pulso el botón y ahora el error es el siguiente:

"3078 en tiempo de ejecución: El motor Jet no puede encontrar la
tabla ''TablaImportada'', asegúrese que existe...

En Depurar muestra la siguiente línea:

Set Rs = CurrentDb.OpenRecordset("TablaImportada", dbOpenSnapshot)

Lo que he hecho es crear a mano la tabla TablaImportada = Campo1
(MEMO) pero entonces el error es:

"13 en tiempo de ejecución: No coinciden los tipos".

En Depurar muestra la mísma línea que la anterior.

====================

¿Puede ser porque el evento lo ejecuto desde un formulario y no sabe el
código pasar de un evento ejecutado en un objeto de tipo FORM a objeto de
tipo TABLA? ¿Si fuese así, como ejecutaría este evento directamente como
TABLA?

De todas formas probaré tu código desde ACCESS 97 si funciona rebibirás
notificación en este mismo foro.

Espero tu respuesta. Por favor. Me estás ayudando mucho, y te lo
agradezco.

Jose Hidalgo

unread,
Nov 30, 2001, 9:21:01 AM11/30/01
to
Ok. Desde Access 97 parece que todo funciona mejor. INCREIBLE. Me esoty
quedando alucinado.

Pero, aún tengo errores.

En primer lugar, la tabla "TablaImportada" tengo que crearla yo, de lo
contrario no me funciona. No sé cuál es la estructura de la tabla, por ello he
intentado adivinar en el código como debe ser. Y he hecho lo siguiente:

Campos TablaImportada = F1 (Memo), F2 (Memo), F3 (Memo), F4 (Memo).

Sólo con F1 daba errores, he incluido sucesiamente hasta F4 (probando con
campos texto y memo) y ahora todo va mejor aunque de repente se para...

El mensaje es:

"Error 3274 en tiempo de ejecución: La tabla externa no está en el formato
esperado".

En depurar va a la línea: DoCmd.TransferText , , "TablaImportada", Path &
Nom

En TablaImporta tengo un total de 590 registros y aparte varias tablas con
los típicos errores de importación.

CREO QUE EL PROBLEMA ES LA ESTRUCTURA DE "TABLAIMPORTADA".
¿CUAL DEBE SER SU ESTRUCTURA?

Evidentemente me dá igual hacerlo con ACCESS 97 porque una vez todo
esté importado podré llevarmelo de 97 a 2000.

pp

unread,
Nov 30, 2001, 2:36:16 PM11/30/01
to
Hola Carlos Carpio
Me gustaria saber que solucione yo, no se a que te refieres
Y yo no utilizo Access 2000 sino el 97

Pau

"CarCar" <ccar...@hotmail.com> escribió en el mensaje
news:661800fa.01112...@posting.google.com...

Vico Fonte

unread,
Nov 30, 2001, 12:13:43 PM11/30/01
to
Oye es increíble eso que dices, ¿eh?, digo lo de los puñeteros problemas que
tienes; no son las referencias. Yo lo solucioné de un modo más increíble
aún: cepillándome en las declaraciones la especificación de objeto, o sea,
dónde suele decir
dim XXX as recordset
...acabé poniendo
dim XXX

No te lo crees ¿verdad?; el ACC2000 tiene esas pequeñas y molestas faltas.


isaac...@gmail.com

unread,
Jul 23, 2020, 1:34:54 AM7/23/20
to
Si quisiera importar desde un txt con mas de diez columnas y mas de 500 registros : ejemplo

FECHA NOMBRE VALOR
**** ****** ****** Etc

Como debería ser el código ?
0 new messages