Página 1 de 2

Lendo linha por linha de um txt

Enviado: 15 Jun 2012 11:46
por bencz
Olá, bom dia.

Estou escrevendo um código para ler um arquivo de texto, mas, estou precisando pegar o tamanho da linha do texto digitado... o código que eu fiz foi esse:

Código: Selecionar todos

nLinhas := MLCount( cText,,,.t.) 
   for i:=1 to nLinhas
      ? cLine := MemoLine( cText,, i,,.t.)
      
      if i == 1
         for j:=1 to len(cLine)
            if cLine[j] <> "Ä" .or. cLine[j] <> "¿"
               if IsAlpha(cLine[j]) .or. IsSpace(cLine[j])
                  cTitle += cLine[j]
               endif
            endif
         next
      endif
   next
Mas o problema é o seguinte, quando eu pego o valor do len(cLine), ele me retorna 79, que é o valor padrão do tamanho da linha do MemoLine, então, gostaria de saber, se tem alguma forma de pegar o tamanho real da linha, até encontrar um "enter" ou chr(13)

Agradeço a ajuda.

Lendo linha por linha de um txt

Enviado: 15 Jun 2012 11:54
por sambomb
aTexto := HB_ATokens( MemoRead( cSeuTxt ), CRLF )

For i := 1 to Len(aTexto)
//-- Cada linha da matriz é uma linha do seu TXT
end

Lendo linha por linha de um txt

Enviado: 15 Jun 2012 13:28
por mateus301
E eu ja tive esse problema e a melhor forma seria com a funcao HB_ATokens( )
vc tem q passar a string da linha e um delimitador no seu caso o chr(13).

Essa função examina caracter por caracter e se for = ao delimitador que voce passou ele adiciona no array até onde ela achou o delimitador

Código: Selecionar todos

cString := |mateus|jose|joao|idade|17|
// meu  delimitador é o caracter |

aAlunos := HB_ATokens( cString, ' | ' )

// O array ficaria assim:
// aAlunos[1] = mateus
// aAlunos[2] = jose
// aAlunos[3] = joao
// aAlunos[4] = idade
// aAlunos[5] = 17

Espero ter ajudado de alguma forma

Lendo linha por linha de um txt

Enviado: 15 Jun 2012 15:05
por ANDRIL
bencz escreveu: quando eu pego o valor do len(cLine), ele me retorna 79, que é o valor padrão do tamanho da linha do MemoLine
Já tentou len(alltrim(cLine))? Geralmente os txt terminam com chr(13)+chr(10) quebrando a linha. Tire o excesso dos espaços nas extremidades e veja se obtem o valor desejado.
Ate+

Lendo linha por linha de um txt

Enviado: 15 Jun 2012 15:11
por Imatech
Acho que podemos melhorar a forma de se fazer isto...

Código: Selecionar todos


#include "fileio.ch"

PROCEDURE Main( cFile )
   LOCAL oFile := TFileRead():New( cFile )
   LOCAL cNewLine := hb_eol()

   oFile:Open()
   IF oFile:Error()
      QOUT( oFile:ErrorMsg( "FileRead: " ) )
   ELSE
      DO WHILE oFile:MoreToRead()
         OUTSTD( oFile:ReadLine() )
         OUTSTD( cNewLine )
      ENDDO
      oFile:Close()
   ENDIF

RETURN


Lendo linha por linha de um txt

Enviado: 15 Jun 2012 16:55
por bencz
bom, quando vou compilar usando o hb_eol()
recebo um erro, falando que essa função nao existe ;/

Lendo linha por linha de um txt

Enviado: 15 Jun 2012 17:00
por Imatech
Olá bencz !



Se estiver usarndo Harbour:

inclua a lib "hbmisc"



Se for o xH... terá que implementar a partir do Big Brother... :)

Lendo linha por linha de um txt

Enviado: 16 Jun 2012 07:52
por Jairo Maia
Olá Pessoal,

O colega Andril já matou o problema. Basta usar o trim, e neste caso, ideal seria mesmo o AllTrim.

Quando o memoline retorna uma linha, o caracter de final de linha não faz parte dela, seja o Chr(13) ou Chr(14).

Basta fazer a seguinte alteração na função:

Código: Selecionar todos

nLinhas := MLCount( cText,,,.t.) 
for i:=1 to nLinhas
  cLine := MemoLine( cText,, i,,.t.)

  ? Len( cLine )  // retornará 79      
  cLine := AllTrim( cLine )
  ? Len( cLine )  // retornará o tamanho da linha
      
  if i == 1
    for j:=1 to len(cLine)
      if cLine[j] <> "Ä" .or. cLine[j] <> "¿"
        if IsAlpha(cLine[j]) .or. IsSpace(cLine[j])
          cTitle += cLine[j]
        endif
      endif
    next
  endif
next 

Lendo linha por linha de um txt

Enviado: 16 Jun 2012 09:00
por bencz
Bom, muito obrigado. (:

outra forma que da para se fazer isso, é utilizando o comando

Código: Selecionar todos

HB_FReadLine(arquivo,@cLinha)
ele retorna a linha, sem o espaço a mais (:

Lendo linha por linha de um txt

Enviado: 18 Jun 2012 08:25
por bencz
e caso eu queira que ele comece a ler de uma linha em especial até uma outra linha em especial, como posso fazer isso ?

Lendo linha por linha de um txt

Enviado: 18 Jun 2012 08:54
por bencz
Deixe p/ la, já descobri como faz, nao tinha me tocado, que era só trocar o I :%

Lendo linha por linha de um txt

Enviado: 18 Jun 2012 10:04
por bencz
bom, na realidade, nao funcionou, pois, aparentemente, o memoread está lendo linhas erradas, por exemplo, se eu passar para ele ler a linha 119 ele começa a ler a linha 111 :/
como posso fazer, p/ resolver isso, existe algum comando ou alguma função, pela qual eu possa passar a linha que eu queira ler ?

Lendo linha por linha de um txt

Enviado: 18 Jun 2012 11:03
por bencz
Bom, o problema é que a linha que ele está lendo é muito grande, e o MLCount nao suporta string muito comprida, msm, setando com uma string com 300 caracteres ou algo assim.... :x

Lendo linha por linha de um txt

Enviado: 18 Jun 2012 11:35
por Pablo César
Se o arquivo tem um tamanho de linha variável, isto é, as vezes um linha tem um tamanho e outra linha outro tamanho... aconselho abandonar a ideia o MLCOUNT. Utilize função de baixo nível: FOPEN, FREAD

Aqui tem vários exemplo no fórum, um deles é: https://pctoledo.org/forum/viewto ... PEN#p29317

Lendo linha por linha de um txt

Enviado: 18 Jun 2012 12:54
por Jairo Maia
Olá Bencz,

Engraçado que você está usando o parâmetro <lLongLines>, e teoricamente deveria ler linhas com mais de 254 caractres. Será que precisa especificar também <nLineLen>?

Tente assim:

Código: Selecionar todos

nLinhas := MLCount( cText, 508, Nil, .t.)