Lendo linha por linha de um txt

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem 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.
Imagem
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Lendo linha por linha de um txt

Mensagem por sambomb »

aTexto := HB_ATokens( MemoRead( cSeuTxt ), CRLF )

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

Rca Sistemas - Itaocara - RJ
mateus301
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 24 Mar 2012 12:47
Localização: marialva/pr

Lendo linha por linha de um txt

Mensagem 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
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Lendo linha por linha de um txt

Mensagem 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+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Lendo linha por linha de um txt

Mensagem 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

M., Ronaldo

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem por bencz »

bom, quando vou compilar usando o hb_eol()
recebo um erro, falando que essa função nao existe ;/
Imagem
Imatech
Usuário Nível 3
Usuário Nível 3
Mensagens: 350
Registrado em: 24 Ago 2010 23:48
Localização: Goiânia-GO

Lendo linha por linha de um txt

Mensagem por Imatech »

Olá bencz !



Se estiver usarndo Harbour:

inclua a lib "hbmisc"



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

by: IMATECH

IMATION TECNOLOGIA
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Lendo linha por linha de um txt

Mensagem 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 
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem 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 (:
Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem 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 ?
Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem por bencz »

Deixe p/ la, já descobri como faz, nao tinha me tocado, que era só trocar o I :%
Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem 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 ?
Imagem
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Lendo linha por linha de um txt

Mensagem 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
Imagem
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Lendo linha por linha de um txt

Mensagem 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
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Lendo linha por linha de um txt

Mensagem 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.) 
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder