Leer fichero de texto línea a línea

Leer fichero de texto línea a línea

Postby fernandomoralesdr » Tue Apr 23, 2013 9: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
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Leer fichero de texto línea a línea

Postby cnavarro » Tue Apr 23, 2013 9:39 pm

Buenas noches
Prueba haciendo algo asi:

Code: Select all  Expand view

   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
User avatar
cnavarro
 
Posts: 6504
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Leer fichero de texto línea a línea

Postby Antonio Linares » Tue Apr 23, 2013 9: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41408
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Leer fichero de texto línea a línea

Postby fernandomoralesdr » 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
fernandomoralesdr
 
Posts: 139
Joined: Sun Apr 23, 2006 9:00 am

Re: Leer fichero de texto línea a línea

Postby quique » Wed Apr 24, 2013 4: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: Select all  Expand view

aArchivo := hb_aTokens( memoRead( "archivo" ), CRLF, .t. )
for each aLineas in aArchivo
   aLineas := hb_aTokens( aLineas, "#", .t. )
next
 
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Re: Leer fichero de texto línea a línea

Postby lubin » Thu Apr 25, 2013 5: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: Select all  Expand view

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

 
User avatar
lubin
 
Posts: 439
Joined: Fri Dec 09, 2005 12:41 am
Location: Lima, Peru


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 36 guests