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)
 

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)


Preguntas similares