none
Carga archivo plano

    Pregunta

  • Hola

    Tengo el siguiente dilema:

    Tengo un archivo de texto en el cual necesito cargar solo una parte del archivo, para identificar desde que punto debo cargar el archivo debo encontrar en el interior de este una cadena de texto predederminada, una vez encontrada esta cadena necesito cargar el archivo desde ese punto hasta encontrar una linea en blanco. quizas esto pueda realizarse a traves de una DTSX o con un Linked Server...

    de antemano gracias





    lunes, 26 de octubre de 2009 22:05

Respuestas

  • Hola.

    Aunque de ambas formas puedes lograrlo, sería el tamaño del archivo lo que determinaría la forma más eficaz. Si es pequeño, mejor un linked server. Si es de gran tamaño, mejor un DTSX. En ambos casos, durante el proceso deberás poder identificar la cadena inicial y la final, y en ambos casos sería lo más fácil que primero volcaras el fichero entero en una tabla con un identity. Luego, localizas la cadena inicial y la final (con blancos) y vuelcas entre ambos registros, dado el identificar previamente creado.

    Si no lo consigues, nos dices.



    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    lunes, 26 de octubre de 2009 22:31
    Moderador
  • Hola.

    5 Mb ya es un número de registros considerable. Un DTSX te sería muy útil. Intenta hacerlo, tomando como origen el fichero de texto plano puedes indicarle que ignore un número dado de líneas, a partir de las cuales estarán tus datos. También puedes elegir el separador, por ejemplo, los nombres de cada campo en función del orden, etc. No es difícil.

    De todos modos, con la sentencia bulk insert lo puedes lograr también, sólo has de indicarle los parámetros FIRSTROW = 10 (lo he contado en tu ejemplo), FIELDTERMITATOR = ',' y ROWTERMINATOR = '\n'. Todo ello lo insertas en una tabla que crees a tal efecto, con los campos TIPO, VALOR, FECHA y CANTIDAD. Sería más o menos así:

    create table MiTablaTxt (TIPO int, VALOR int, FECHA char(10), CANTIDAD int)
    go
    
    BULK INSERT MiTablaTxt FROM 'c:\Temp\Mitxt.txt'
    WITH
    (
      FIELDTERMINATOR =',',
      ROWTERMINATOR = '\n',
      FIRSTROW = 10
    )
    GO


    Con eso ya estaría. Si no lo consigues, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 27 de octubre de 2009 13:56
    Moderador

Todas las respuestas

  • Hola.

    Aunque de ambas formas puedes lograrlo, sería el tamaño del archivo lo que determinaría la forma más eficaz. Si es pequeño, mejor un linked server. Si es de gran tamaño, mejor un DTSX. En ambos casos, durante el proceso deberás poder identificar la cadena inicial y la final, y en ambos casos sería lo más fácil que primero volcaras el fichero entero en una tabla con un identity. Luego, localizas la cadena inicial y la final (con blancos) y vuelcas entre ambos registros, dado el identificar previamente creado.

    Si no lo consigues, nos dices.



    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    lunes, 26 de octubre de 2009 22:31
    Moderador
  • Estimado hice algunas pruebas sin exito lo que realize fue lo siguiente
     
    1.-Cargue en su totalidad el archivo plano a una tabla en la base de datos a través de la sentencia "Bulk Insert" (aunque no separe los campos por algún delimitador, ya que el archivo en sí inicia con un tiulo luego la fecha,luego viene los titulo de los diferentes informes que posee luego las columnas de los registros y finalmento los datos en si los que se encuentran delimitados por ",") , dejo un ejemplo de como es el contenido del archivo.

      REPORTE DIARIO TARJETAS
             ===========================================
     
    - Fecha/Hora: 2009-12-12 -
     
     
    INFORME DIARIO DE TARJETAS CARGADAS POR TIPO
    =============================================
     
    TIPO         VALOR         FECHA        CANTIDAD
    ----         -----         -----         --------
    1,     1111,   2009-12-12   ,  1111
    2,     2222,   2009-12-12   ,  2222


     2.- luego agregue una columna con el identity y trate de realizar una sentencia que permitiera selecionar solo cierta areá del archivo adjunto codigo:
    Declare   @var Nvarchar(255),
    		@inicial Nvarchar(250),
    		@final Nvarchar(250)
    	Set @inicial = 'INFORME ACUMULADO de TIPOS DE TARJETAS  POR ESTADO Y CANTIDAD'
    	Set @final =' '
    	Set @var = (Select ident From prueba_txt Where datos =@inicial )
    -- con la variable @var almaceno en que linea se encuentra la cadena de texto a encontrar
    			
    --				Select * 
    --				Into prueba_txt_2
    --				From prueba_txt	
    --				where ident > @var+5 --and datos !=@final
    
    
    	If (Select IDENT From prueba_txt Where IDENT =@VAR+5) is not null
    		Begin
    
    			While (Select Datos From prueba_txt Where DATOS != ' ') != null 
    				Begin
    			
    				Select * 
    					Into prueba_txt_2
    						From prueba_txt	
    					--		WITH (FIELDTERMINATOR = ',')
    				
    				End
    		
    		End
    
    

    A pesar que el tamaño de estos archivos no superan los 5MB,  quizas sea mejor hacer con una DTSX aunque ingnoro si existe la opción de encontrar de cargas desde una cadena de texto inicial espeifica hasta una cadena de texto final.

    Saludos.
    martes, 27 de octubre de 2009 13:38
  • Hola.

    5 Mb ya es un número de registros considerable. Un DTSX te sería muy útil. Intenta hacerlo, tomando como origen el fichero de texto plano puedes indicarle que ignore un número dado de líneas, a partir de las cuales estarán tus datos. También puedes elegir el separador, por ejemplo, los nombres de cada campo en función del orden, etc. No es difícil.

    De todos modos, con la sentencia bulk insert lo puedes lograr también, sólo has de indicarle los parámetros FIRSTROW = 10 (lo he contado en tu ejemplo), FIELDTERMITATOR = ',' y ROWTERMINATOR = '\n'. Todo ello lo insertas en una tabla que crees a tal efecto, con los campos TIPO, VALOR, FECHA y CANTIDAD. Sería más o menos así:

    create table MiTablaTxt (TIPO int, VALOR int, FECHA char(10), CANTIDAD int)
    go
    
    BULK INSERT MiTablaTxt FROM 'c:\Temp\Mitxt.txt'
    WITH
    (
      FIELDTERMINATOR =',',
      ROWTERMINATOR = '\n',
      FIRSTROW = 10
    )
    GO


    Con eso ya estaría. Si no lo consigues, nos dices.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 27 de octubre de 2009 13:56
    Moderador
  • Qwalgrande

    El dejar fija la fila en que inicio a tomar los registros desde una DTSX no me sirve, debido a que el punto desde donde debo extraer la información es variable (el archivo de hoy puede ser la fila 140, el de mañana 147 etc), asi que voy a hacer pruebas con el codigo que me suguieres a ver que me sale si lo llego a una solución subire el codigo y si no seguire preguntando XD.

    Saludos.
    martes, 27 de octubre de 2009 14:05
  • No he logrado ejecutar la consulta de forma correcta, si doy los rangos de la fila de inicio y de termino reales del archivo (ejemplo 150 a 209) me extrae una lista de registros desde otro punto del archivo txt, ahora si quierro extraer los datos del rango 150-209 debo escribir el rango (103-160)  en la consulta, habrá alguna forma de poder hacer lo que quiero con una DTSx .

    De antemano gracias.
    Saludos.
    martes, 27 de octubre de 2009 18:26