FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Leer fichero de texto línea a línea
Posts: 139
Joined: Sun Apr 23, 2006 09:00 AM
Leer fichero de texto línea a línea
Posted: Tue Apr 23, 2013 09:21 PM

Hola a todos.

Tengo un fichero de texto exportado por otra aplicación y delimitados sus campos por el carácter #. ¿Podría alguien decirme cómo puedo leer línea a línea para volcarla en una variable y descomponerla en sus diferentes campos?

Gracias por adelantado y un saludo,

Un saludo,

Fernando

Las Palmas de Gran Canaria
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Leer fichero de texto línea a línea
Posted: Tue Apr 23, 2013 09:39 PM
Buenas noches
Prueba haciendo algo asi:

Code (fw): Select all Collapse
   oFile  := TTxtFile():New( cFile )
   oFile:nMaxLineLength := 256

   Do while !oFile:Eof()
    
      cLin   := oFile:ReadLine()
      if !empty( cLin )


      // Resto codigo: analisis de linea

      endif

      if !empty( cLin1 )
         nLin++
      endif
      oFile:Skipper()

   Enddo

   oFile:End()


Espero te sirva como base
Un saludo
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Leer fichero de texto línea a línea
Posted: Tue Apr 23, 2013 09:46 PM

Fernando,

Si el fichero de texto es muy grande, entonces hay que buscar el acelerar al máximo su proceso, y existe una forma de acelerar mucho su lectura línea a línea:

Revisa FWH/samples/re.prg, fijate en como se usa la función ExtractLine()

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 139
Joined: Sun Apr 23, 2006 09:00 AM
Re: Leer fichero de texto línea a línea
Posted: Tue Apr 23, 2013 10:35 PM

Gracias Antonio.
De eso es de lo que se trata. Utilizo una función que me lee el archivo en un array o en un archivo, pero se vuelve inviable con archivos muy grandes, de ahí la consulta: leer línea a línea para no gastar recursor y acelerar al máximo. De todas formas, tanto con lo que me dices del samples como con lo del compañero del post anterior voy en camino de la solución. Una vez más, GRACIAS.

Un saludo,

Un saludo,

Fernando

Las Palmas de Gran Canaria
Posts: 408
Joined: Sun Aug 13, 2006 05:38 AM
Re: Leer fichero de texto línea a línea
Posted: Wed Apr 24, 2013 04:41 AM
puedes tratar con algo asi para tener en aArchivo una matriz bidimencional, donde cada elemento sería un arreglo con los campos del registro.

Code (fw): Select all Collapse
aArchivo := hb_aTokens( memoRead( "archivo" ), CRLF, .t. )
for each aLineas in aArchivo
   aLineas := hb_aTokens( aLineas, "#", .t. )
next
Saludos

Quique
Posts: 467
Joined: Fri Dec 09, 2005 12:41 AM
Re: Leer fichero de texto línea a línea
Posted: Thu Apr 25, 2013 05:25 PM
Hola Fernando

Respecto a extraer los textos de una Linea de texto dados un delimitador quizas te ayude esta funcion que hice hace tiempo,
espero que te sirva

Lubin


Code (fw): Select all Collapse
FUNCTION FSTRDAT(cl_chr,cl_lim,cl_ind,cl_replace)
*0****************
* AUTOR...........: Lubin Azahuanche
* FECHA...........: 20/Julio/1,994
* NEMONICO........: Sacar String segun delimitador y numero de elemento
* SINTAXIS........: ??? = FSTRDAT(ExpC,Limitador [,Nr.Elemento [,Chr.Replace]])
*         ........:   ExpC       Valor Character por analizar
*         ........:   Limitador  Valor Character que separa Valores
*         ........:   Nr. Elemento  Valor Numerico correspondiente al elemtento a sacar
*         ........:   String por Reemplazar en el N§ de Elemento indicado
*         ........:
*         ........: Modo Contador : retorna cuantos elementos existen con el delimitador dado en el String
*         ........: Num = FSTRDAT(ExpC,Limitador)
*         ........:  Ejemplo :
*         ........:            FSTRDAT("123.AXC..BD.567",".")    =     6
*         ........:            FSTRDAT("               ",".")    =     0
*         ........:            FSTRDAT("123            ",".")    =     1
*         ........: Modo Extractor : Extrae el Elmento que se ubique en en el numero de de Elemento
*         ........: Chr = FSTRDAT(ExpC,Limitador,Nr.Elemento)
*         ........:  Ejemplo :
*         ........:            FSTRDAT("123.AXC..BD.567",".",2)  =    "AXC"
*         ........:            FSTRDAT("123.AXC..BD.567",".",3)  =    ""
*         ........: Modo Replace
*         ........: Chr = FSTRDAT(ExpC,Limitador,Nr.Elemento,Chr.Replace)
*         ........:  Ejemplo :
*         ........:            FSTRDAT("123.AXC..BD.567",".",3,"abc")  = "123.AXC.abc.BD.567"
*         ........:            FSTRDAT("123.AXC..BD.567",".",2,"abcd") = "123.abcd..BD.567"
*         ........:            FSTRDAT("123.AXC..BD.567",".",2,"")     = "123...BD.567"
* ALCANCE.........: Uso general para extraer,cambiar parametros multiples en string
* RETORNA.........: CHR o NUM  segun parametros
*********************************************************************************************************
LOCAL     cl_nr,cl_dchr

DO CASE
  CASE PCOUNT() < 2
     ?"Error Parameters  LFSTRDAT() "
     QUIT
  CASE PCOUNT() = 2
    cl_nr = 0
    IF .NOT. EMPTY(cl_chr)
      cl_lim = ALLTRIM(cl_lim)
      cl_chr = cl_lim + ALLTRIM(cl_chr)
      DO WHILE  AT(cl_lim ,cl_chr) >0
         cl_chr =  SUBSTR(cl_chr,AT(cl_lim ,cl_chr)+1)
         cl_nr  =  cl_nr + 1
      ENDDO
    ENDIF
    RETURN cl_nr

  CASE PCOUNT() = 3
    cl_nr = 0
    cl_dchr = ""
    IF .NOT. EMPTY(cl_chr)
      cl_lim = ALLTRIM(cl_lim)
      cl_chr = cl_lim + ALLTRIM(cl_chr)
      DO WHILE  AT(cl_lim ,cl_chr) >0  .AND. cl_nr <> cl_ind
         cl_chr =  SUBSTR(cl_chr,AT(cl_lim ,cl_chr)+1)
         cl_nr  =  cl_nr + 1
      ENDDO
      cl_dchr =ALLTRIM(SUBSTR(cl_chr,1,AT(cl_lim,cl_chr+cl_lim)-1))
    ENDIF
    RETURN cl_dchr
ENDCASE

* CASO PCOUNT() = 4
cl_nr = 0
cl_dchr = ""
IF .NOT. EMPTY(cl_chr)
  cl_lim = ALLTRIM(cl_lim)
  cl_chr = cl_lim + ALLTRIM(cl_chr)
  DO WHILE  AT(cl_lim ,cl_chr) >0
     IF  cl_nr <> cl_ind
        cl_dchr =cl_dchr+ALLTRIM(SUBSTR(cl_chr,1,AT(cl_lim,cl_chr+cl_lim)-1))+cl_lim
     ELSE
        cl_dchr = cl_dchr + ALLTRIM(cl_replace) +cl_lim
     ENDIF
     cl_chr =  SUBSTR(cl_chr,AT(cl_lim ,cl_chr)+1)
     cl_nr  =  cl_nr + 1
  ENDDO
  cl_dchr = SUBSTR(cl_dchr,2)+cl_chr
ENDIF
RETURN cl_dchr

Continue the discussion