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
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....

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: