Importación de ficheros con filas de longitud variable.

16/02/2005 - 18:03 por Salvador Ramos | Informe spam
Hola a todos:

Tengo unos ficheros de texto cuyas filas vienen con distintas longitudes de
registro y diferentes contenidos, según los caracteres que aparezcan en el
encabezado. Os paso un ejemplo de su contenido (cada fila es mucho más
larga, incluso en ocasiones supera los 10.000 caracteres):
8A01X,07-02-0500000121EU01010132170.830134025.7600...
8A04X,07-02-0500000121EU9724301801932029 00000000...
8A06X,07-02-0500000121EU 10000819.781
8A07X,07-02-0500000121EU010000000.000000000.000035...
El contenido será distinto en función de lo que aparezca al principio
(8A01X, 8A04X, ...)

Lo primero que hago es importarlo desde texto a una tabla que sólo contiene
un campo nText, eso ya me funciona perfectamente. Ahora me falta recorrer
esa tabla y extraer la información para almacenarla en diferentes tablas,
según el formato, y ya con sus columnas correspondientes.

Estoy probando el siguiente código que se aproxima a lo que necesito:
DECLARE @ptrval varbinary(16)
DECLARE @Inicio INT
DECLARE @Fin INT
DECLARE @C INT
DECLARE @Texto VARCHAR(8000)
SET @Inicio = 1
SET @Fin = @Inicio + 123
SET @C = 1
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
WHILE @C <= 50 BEGIN
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
@Fin)
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
PRINT @Texto
SET @C = @C + 1
SET @Inicio = @Inicio + 24
END

Pero tengo los siguientes problemas:
- Necesito almacenar el contenido extraído con READTEXT en una variable
- El bucle no siempre es hasta 50, las filas son de longitud variable. No
veo claro cómo añadirle una condición por si hubiese menos de 50 registros
en esa fila.
- Me falta implementar un CASE en función del formato de registro para que
extraiga bien la información (eso no me preocupa una vez solucionados los
puntos anteriores.

En fin, si se os ocurre la solución a estos problemas puntuales, así como
alguna otra alternativa que veáis mejor para hacer este proceso también
sería interesante. Estoy abierto a cualquier idea. La verdad que llevo mucho
tiempo sin realizar extracciones de substrings de un campo text.

Pd. Sé que lo podría hacer, por ejemplo desde vb.net, pero lo quiero hacer
con DTS ;-)

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

Preguntas similare

Leer las respuestas

#1 Maxi
16/02/2005 - 22:44 | Informe spam
Hola, ufaa Salvador quieres insistir con el DTS ;)

Veamos y pensemos ;-), has probado de armar un DTS pero con VBSCRIPT? y
poner ahi las instrucciones?

otro tema, tendrias un archivo de ejemplo para poder hacer pruebas?


Salu2
Maxi


"Salvador Ramos" escribió en el
mensaje news:
Hola a todos:

Tengo unos ficheros de texto cuyas filas vienen con distintas longitudes
de registro y diferentes contenidos, según los caracteres que aparezcan en
el encabezado. Os paso un ejemplo de su contenido (cada fila es mucho más
larga, incluso en ocasiones supera los 10.000 caracteres):
8A01X,07-02-0500000121EU01010132170.830134025.7600...
8A04X,07-02-0500000121EU9724301801932029 00000000...
8A06X,07-02-0500000121EU 10000819.781
8A07X,07-02-0500000121EU010000000.000000000.000035...
El contenido será distinto en función de lo que aparezca al principio
(8A01X, 8A04X, ...)

Lo primero que hago es importarlo desde texto a una tabla que sólo
contiene un campo nText, eso ya me funciona perfectamente. Ahora me falta
recorrer esa tabla y extraer la información para almacenarla en diferentes
tablas, según el formato, y ya con sus columnas correspondientes.

Estoy probando el siguiente código que se aproxima a lo que necesito:
DECLARE @ptrval varbinary(16)
DECLARE @Inicio INT
DECLARE @Fin INT
DECLARE @C INT
DECLARE @Texto VARCHAR(8000)
SET @Inicio = 1
SET @Fin = @Inicio + 123
SET @C = 1
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
WHILE @C <= 50 BEGIN
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
@Fin)
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
PRINT @Texto
SET @C = @C + 1
SET @Inicio = @Inicio + 24
END

Pero tengo los siguientes problemas:
- Necesito almacenar el contenido extraído con READTEXT en una variable
- El bucle no siempre es hasta 50, las filas son de longitud variable. No
veo claro cómo añadirle una condición por si hubiese menos de 50 registros
en esa fila.
- Me falta implementar un CASE en función del formato de registro para que
extraiga bien la información (eso no me preocupa una vez solucionados los
puntos anteriores.

En fin, si se os ocurre la solución a estos problemas puntuales, así como
alguna otra alternativa que veáis mejor para hacer este proceso también
sería interesante. Estoy abierto a cualquier idea. La verdad que llevo
mucho tiempo sin realizar extracciones de substrings de un campo text.

Pd. Sé que lo podría hacer, por ejemplo desde vb.net, pero lo quiero hacer
con DTS ;-)

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)


Respuesta Responder a este mensaje
#2 Salvador Ramos
17/02/2005 - 10:40 | Informe spam
La verdad que si que lo pensé, de hecho podría hacerlo en .Net como comenté,
pero no quiero utilizar ni .net ni vbscrip ni similares, aun pareciendome
una buena solución. Mi idea es, si es posible, hacerlo con T-SQL :-)

No es por nada en especial, simplemente quiero solucionar el problema y
además tener un ejemplo que sirva como base para montar una importación de
datos secilla, y en T-SQL, partiendo de cualquier fichero de longitud
variable.

Mi idea se resume en extraer bloques de texto de un campo text o ntext y
almacenar cada bloque como una fila en un campo varchar en otra tabla.

El archivo no puedo enviarlo aquí porque los datos son confidenciales :-(

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"Maxi" escribió en el mensaje
news:
Hola, ufaa Salvador quieres insistir con el DTS ;)

Veamos y pensemos ;-), has probado de armar un DTS pero con VBSCRIPT? y
poner ahi las instrucciones?

otro tema, tendrias un archivo de ejemplo para poder hacer pruebas?


Salu2
Maxi


"Salvador Ramos" escribió en el
mensaje news:
Hola a todos:

Tengo unos ficheros de texto cuyas filas vienen con distintas longitudes
de registro y diferentes contenidos, según los caracteres que aparezcan
en el encabezado. Os paso un ejemplo de su contenido (cada fila es mucho
más larga, incluso en ocasiones supera los 10.000 caracteres):
8A01X,07-02-0500000121EU01010132170.830134025.7600...
8A04X,07-02-0500000121EU9724301801932029 00000000...
8A06X,07-02-0500000121EU 10000819.781
8A07X,07-02-0500000121EU010000000.000000000.000035...
El contenido será distinto en función de lo que aparezca al principio
(8A01X, 8A04X, ...)

Lo primero que hago es importarlo desde texto a una tabla que sólo
contiene un campo nText, eso ya me funciona perfectamente. Ahora me falta
recorrer esa tabla y extraer la información para almacenarla en
diferentes tablas, según el formato, y ya con sus columnas
correspondientes.

Estoy probando el siguiente código que se aproxima a lo que necesito:
DECLARE @ptrval varbinary(16)
DECLARE @Inicio INT
DECLARE @Fin INT
DECLARE @C INT
DECLARE @Texto VARCHAR(8000)
SET @Inicio = 1
SET @Fin = @Inicio + 123
SET @C = 1
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
WHILE @C <= 50 BEGIN
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
@Fin)
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
PRINT @Texto
SET @C = @C + 1
SET @Inicio = @Inicio + 24
END

Pero tengo los siguientes problemas:
- Necesito almacenar el contenido extraído con READTEXT en una variable
- El bucle no siempre es hasta 50, las filas son de longitud variable. No
veo claro cómo añadirle una condición por si hubiese menos de 50
registros en esa fila.
- Me falta implementar un CASE en función del formato de registro para
que extraiga bien la información (eso no me preocupa una vez solucionados
los puntos anteriores.

En fin, si se os ocurre la solución a estos problemas puntuales, así como
alguna otra alternativa que veáis mejor para hacer este proceso también
sería interesante. Estoy abierto a cualquier idea. La verdad que llevo
mucho tiempo sin realizar extracciones de substrings de un campo text.

Pd. Sé que lo podría hacer, por ejemplo desde vb.net, pero lo quiero
hacer con DTS ;-)

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)






Respuesta Responder a este mensaje
#3 Maxi
17/02/2005 - 13:13 | Informe spam
Hola, bueno dejame entonces ver como te puedo ayudar :-) voy a intentar con
esto que pasastes armar un modelito y ver hasta donde llegamos :-)


Salu2
Maxi


"Salvador Ramos" escribió en el
mensaje news:
La verdad que si que lo pensé, de hecho podría hacerlo en .Net como
comenté, pero no quiero utilizar ni .net ni vbscrip ni similares, aun
pareciendome una buena solución. Mi idea es, si es posible, hacerlo con
T-SQL :-)

No es por nada en especial, simplemente quiero solucionar el problema y
además tener un ejemplo que sirva como base para montar una importación de
datos secilla, y en T-SQL, partiendo de cualquier fichero de longitud
variable.

Mi idea se resume en extraer bloques de texto de un campo text o ntext y
almacenar cada bloque como una fila en un campo varchar en otra tabla.

El archivo no puedo enviarlo aquí porque los datos son confidenciales :-(

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"Maxi" escribió en el mensaje
news:
Hola, ufaa Salvador quieres insistir con el DTS ;)

Veamos y pensemos ;-), has probado de armar un DTS pero con VBSCRIPT? y
poner ahi las instrucciones?

otro tema, tendrias un archivo de ejemplo para poder hacer pruebas?


Salu2
Maxi


"Salvador Ramos" escribió en el
mensaje news:
Hola a todos:

Tengo unos ficheros de texto cuyas filas vienen con distintas longitudes
de registro y diferentes contenidos, según los caracteres que aparezcan
en el encabezado. Os paso un ejemplo de su contenido (cada fila es mucho
más larga, incluso en ocasiones supera los 10.000 caracteres):
8A01X,07-02-0500000121EU01010132170.830134025.7600...
8A04X,07-02-0500000121EU9724301801932029 00000000...
8A06X,07-02-0500000121EU 10000819.781
8A07X,07-02-0500000121EU010000000.000000000.000035...
El contenido será distinto en función de lo que aparezca al principio
(8A01X, 8A04X, ...)

Lo primero que hago es importarlo desde texto a una tabla que sólo
contiene un campo nText, eso ya me funciona perfectamente. Ahora me
falta recorrer esa tabla y extraer la información para almacenarla en
diferentes tablas, según el formato, y ya con sus columnas
correspondientes.

Estoy probando el siguiente código que se aproxima a lo que necesito:
DECLARE @ptrval varbinary(16)
DECLARE @Inicio INT
DECLARE @Fin INT
DECLARE @C INT
DECLARE @Texto VARCHAR(8000)
SET @Inicio = 1
SET @Fin = @Inicio + 123
SET @C = 1
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
WHILE @C <= 50 BEGIN
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
@Inicio @Fin)
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
PRINT @Texto
SET @C = @C + 1
SET @Inicio = @Inicio + 24
END

Pero tengo los siguientes problemas:
- Necesito almacenar el contenido extraído con READTEXT en una variable
- El bucle no siempre es hasta 50, las filas son de longitud variable.
No veo claro cómo añadirle una condición por si hubiese menos de 50
registros en esa fila.
- Me falta implementar un CASE en función del formato de registro para
que extraiga bien la información (eso no me preocupa una vez
solucionados los puntos anteriores.

En fin, si se os ocurre la solución a estos problemas puntuales, así
como alguna otra alternativa que veáis mejor para hacer este proceso
también sería interesante. Estoy abierto a cualquier idea. La verdad que
llevo mucho tiempo sin realizar extracciones de substrings de un campo
text.

Pd. Sé que lo podría hacer, por ejemplo desde vb.net, pero lo quiero
hacer con DTS ;-)

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)










Respuesta Responder a este mensaje
#4 Salvador Ramos
17/02/2005 - 13:55 | Informe spam
Muchas gracias :-)

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"Maxi" escribió en el mensaje
news:
Hola, bueno dejame entonces ver como te puedo ayudar :-) voy a intentar
con esto que pasastes armar un modelito y ver hasta donde llegamos :-)


Salu2
Maxi


"Salvador Ramos" escribió en el
mensaje news:
La verdad que si que lo pensé, de hecho podría hacerlo en .Net como
comenté, pero no quiero utilizar ni .net ni vbscrip ni similares, aun
pareciendome una buena solución. Mi idea es, si es posible, hacerlo con
T-SQL :-)

No es por nada en especial, simplemente quiero solucionar el problema y
además tener un ejemplo que sirva como base para montar una importación
de datos secilla, y en T-SQL, partiendo de cualquier fichero de longitud
variable.

Mi idea se resume en extraer bloques de texto de un campo text o ntext y
almacenar cada bloque como una fila en un campo varchar en otra tabla.

El archivo no puedo enviarlo aquí porque los datos son confidenciales :-(

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"Maxi" escribió en el mensaje
news:
Hola, ufaa Salvador quieres insistir con el DTS ;)

Veamos y pensemos ;-), has probado de armar un DTS pero con VBSCRIPT? y
poner ahi las instrucciones?

otro tema, tendrias un archivo de ejemplo para poder hacer pruebas?


Salu2
Maxi


"Salvador Ramos" escribió en el
mensaje news:
Hola a todos:

Tengo unos ficheros de texto cuyas filas vienen con distintas
longitudes de registro y diferentes contenidos, según los caracteres
que aparezcan en el encabezado. Os paso un ejemplo de su contenido
(cada fila es mucho más larga, incluso en ocasiones supera los 10.000
caracteres):
8A01X,07-02-0500000121EU01010132170.830134025.7600...
8A04X,07-02-0500000121EU9724301801932029 00000000...
8A06X,07-02-0500000121EU 10000819.781
8A07X,07-02-0500000121EU010000000.000000000.000035...
El contenido será distinto en función de lo que aparezca al principio
(8A01X, 8A04X, ...)

Lo primero que hago es importarlo desde texto a una tabla que sólo
contiene un campo nText, eso ya me funciona perfectamente. Ahora me
falta recorrer esa tabla y extraer la información para almacenarla en
diferentes tablas, según el formato, y ya con sus columnas
correspondientes.

Estoy probando el siguiente código que se aproxima a lo que necesito:
DECLARE @ptrval varbinary(16)
DECLARE @Inicio INT
DECLARE @Fin INT
DECLARE @C INT
DECLARE @Texto VARCHAR(8000)
SET @Inicio = 1
SET @Fin = @Inicio + 123
SET @C = 1
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
WHILE @C <= 50 BEGIN
SELECT @ptrval = TEXTPTR(Texto) FROM tmpNText
@Inicio @Fin)
READTEXT tmpNText.Texto @ptrval @Inicio @Fin
PRINT @Texto
SET @C = @C + 1
SET @Inicio = @Inicio + 24
END

Pero tengo los siguientes problemas:
- Necesito almacenar el contenido extraído con READTEXT en una variable
- El bucle no siempre es hasta 50, las filas son de longitud variable.
No veo claro cómo añadirle una condición por si hubiese menos de 50
registros en esa fila.
- Me falta implementar un CASE en función del formato de registro para
que extraiga bien la información (eso no me preocupa una vez
solucionados los puntos anteriores.

En fin, si se os ocurre la solución a estos problemas puntuales, así
como alguna otra alternativa que veáis mejor para hacer este proceso
también sería interesante. Estoy abierto a cualquier idea. La verdad
que llevo mucho tiempo sin realizar extracciones de substrings de un
campo text.

Pd. Sé que lo podría hacer, por ejemplo desde vb.net, pero lo quiero
hacer con DTS ;-)

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)














email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida