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