Página 1 de 1
Busca em arquivo texto
Enviado: 04 Abr 2005 13:29
por negrao
Pessoal, em um arquivo texto tenho as seguintes informacoes
*1 teste 27/05/05
*2 outro teste 13/02/04
*3 mais teste 01/01/01
Que comando uso para ir na informacao *2 e pegar o conteudo dessa linha ?
Obrigado
Enviado: 04 Abr 2005 14:42
por Clipper
Prezado Negrão
Acho que a melhor forma de fazer isso seria copiando o conteúdo do arquivo texto para um DBF temporário e a partir daí usar o LOCATE para encontrar a linha e capturar a informação.
Você poderia criar um DBF temporário com a seguinte estutura.
NOME DO CAMPO : TEXTO
TIPO : C
TAMANHO : 254
Usar o APPEND FROM SDF para receber os dados do arquivo texto e o resto você já sabe.
Até logo.
Marcelo
Enviado: 05 Abr 2005 01:07
por Maligno
Com respeito ao nosso amigo Marcelo, a melhor forma, sem dúvida, NÃO é copiar tudo para um DBF. Pode ser mais fácil e cômodo, mas está longe de ser uma boa solução. Não é a forma mais rápida. Um arquivo DBF teria de ser povoado e depois indexado. Isso levará mais tempo que uma pesquisa direta no arquivo texto. Nem é tão difícil. Acontece que é uma coisa que normalmente dá uma embaralhada na cabeça da maioria. Deixo-lhe um exemplo tosco, não testado, que extraí de uma função minha, e que deve dar uma idéia de como você poderá resolver seu problema. E talvez, até poderá ser utilizado como partida para a produção de uma função bem genérica.
Código: Selecionar todos
#define _kSIZE 2048
#define _kEOL Chr(13)+Chr(10)
//------------------------------------------------------------
function Leitura(cFileN)
local nByts // bytes lidos na iteração
local nLins := 0 // quantidade de linhas
local cBuff := Space(_kSIZE) // buffer de armazenamento
local cRest := "" // resto da leitura
local cFileH := FOpen(cFileN)) = -1 // alça do arquivo aberto
*
if nFileH = -1
// Erro na abertura do arquivo! Trate o erro à sua maneira
return .F.
end
*
while (nByts := FRead(cFileH,@cBuff,_kSIZE)) > 0 .or. !Empty(cRest)
cBuff := RTrim(cBuff)
cBuff := cRest+cBuff
cBuff += if(nByts=0 .and. Right(cBuff,2) != _kEOL, _kEOL, "")
//
// Individualização da linha através do par CR/LF (_kEOL)
while (i := At(_kEOL,cBuff)) > 0
// A linha já individualizada, sem _kEOL
cLine := Left(cBuff,i-1)
// Ajuste do buffer, descartando o _kEOL
cBuff := SubStr(cBuff,i+2)
// Contador de linhas, caso precise
nLins ++
//
//
// Neste ponto você poderá fazer sua pesquisa
// dentro da linha, usando as funções básicas
// do Clipper.
//
//
end
// Pode sobrar algo após o último _kEOL
cRest := cBuff
// Reset do buffer para nova leitura
cBuff := Space(_kSIZE)
end
Acho que deverá funcionar. Mas mesmo que não funcione, acho que já dá pra ter uma idéia de que essa solução não é tão complicada.
[]'s
Maligno
http://www.buzinello.com/prg
Enviado: 05 Abr 2005 12:25
por Clipper
Realmente não é a melhor solução mas acho que é a mais prática, e não é necessário a criação de indices, pois ele poderá usar o comando LOCATE que não necessita que o arquivo esteja indexado, vejam um exemplo prático :
Código: Selecionar todos
private busca
cls
if .not. file("TEXTO.DBF")
aStructure := {}
aAdd( aStructure,{"TEXTO","C",254,0})
dbCreate( "TEXTO.DBF",aStructure)
use TEXTO new
else
use TEXTO new
zap
endif
APPEND FROM TEXTO.TXT SDF
busca=space(30)
@ 02,00 say "Buscar -> " get busca
read
if empty(busca) .or. lastkey()=27
dbcloseall()
return
endif
fbusca(alltrim(busca))
return
function fbusca(bbusca)
locate for bbusca$texto
if eof()
@ 24,00 say "Nada encontrado..."
inkey(2)
@ 24,00 clear to 24,79
else
@ 24,00 say "Encontrado no registro "+alltrim(str(recno(),6))
inkey(0)
@ 24,00 clear to 24,79
endif
return(.t.)
Até logo.
Marcelo