Página 1 de 1

Busca String em Arquivo TXT

Enviado: 29 Mar 2012 17:59
por asimoes
Pessoal,

Estou precisando de uma função que localize uma string em um txt, tipo find in files do ultraedit.

A função deve encontrar todas as ocorrência de parte da string informada.

Busca String em Arquivo TXT

Enviado: 29 Mar 2012 19:51
por Jairo Maia
Olá Asimoes,

Veja se lhe ajuda:

Código: Selecionar todos

Param cString, cExt

If Empty( cString )
 Alert( "cString não especificada" )
 Return Nil
Else
 cString := Uppe( cString )
 cExt:=If( Empty( cExt ), ".TXT", cExt )
Endi

aArqDir:=Directory( "*"+cExt )
If Len( aArqDir ) = 0
 Alert( "Nenhum arquivo "+cExt+" Nessa pasta" )
 Return Nil
Endi

aArqDir1:={}
aEncontrou:={}
Aeval( aArqDir, { |arq| AADD( aArqDir1, arq[1] ) } )

For i=1 TO Len( aArqDir1 )
 Clear Screen
 cArquivo:=aArqDir1[i]
 @ 2,2 say "Procurando cString no cArquivo => "+cArquivo
 cBuffer := Uppe( MemoRead( cArquivo ) )
 If (cString $ cBuffer)
  posi:=Ascan( aEncontrou, { |arq| cArquivo==arq[1] } )
  If posi=0
   AADD( aEncontrou, { cArquivo, 0 } )
   nPosi:=Len( aEncontrou )
  Endi
  Whil (cString $ cBuffer)
   cBuffer := StrTran( cBuffer, cString, "", 1, 1 )
   aEncontrou[ nPosi,2 ] += 1
  Endd
 Endi
Next

Clear Screen
If Len( aEncontrou ) != 0
 cMsg:=""
 aResult:={}
 For i=1 To Len( aEncontrou )
  cMsg:=Padr( aEncontrou[i,1], 12 )+" => "+StrZero( aEncontrou[i,2], 3 )+" ocorrˆncia(s)"
  AADD( aResult, cMsg )
 NEXT
 nArq=1
 Whil nArq!=0
  nArq := AChoice( 3, 1, MaxRow() - 1, MaxCol() - 1, aResult, .T.,, nArq )
  If nArq!=0
   qarq:=ALLTRIM(aEncontrou[nArq,1])
   ! EDIT &qarq.
  Endi
 Endd
Else
 cMsg:="Não econtrei Nenhuma ocorrência: "+cString+";"+;
      "Procurei em todos cArquivos => [*&cExt.]"
 Alert( cMsg )
Endi
Clear Screen
Return Nil

Busca String em Arquivo TXT

Enviado: 29 Mar 2012 19:54
por alxsts
Olá!

No tópico Visualizar arquivo no video - vai alem 64k tem um fonte do Rick Spence, levemente modificado.

Este código abre um arquivo .TXT em um TBrowse e permite que o usuário navegue através dele, com possibilidade de busca para a frente e para trás. Veja as funções FrwdSrch() e BkwdSrch().

Já usei e é muito bom. Provavelmente você já conhece e não lembra.

Busca String em Arquivo TXT

Enviado: 30 Mar 2012 10:07
por sambomb

Código: Selecionar todos

Function PesquisaEmArquivos( cPesquisa, cPasta, cTipoArquivo)

Local aDir := {}, aResult := {}
Local nCount := 0, nPos := 0, i := 0, j := 0
Local cTxt := ""

	//-- Opções padrão
	Default cPesquisa := "", cPasta := "C:\", cTipoArquivo := ""

	//-- Obter a lista de arquivos em uma determinada pasta, pode ser enviado por exemplo "C:\teste\*.txt" de forma a obter apenas TXT ou então usar o parâmetro cTipoArquivo para isso
	aDir := Directory(cPasta)

	//-- Rodar todos os arquivos do diretório
	For i := 1 to Len(aDir)
		
		//-- Verificar a extensão do arquivo
		If Empty(cTipoArquivo) .Or. ( cFileExt(MemoRead(aDir[i,1])) $ cTipoArquivo )
			
			//-- Carregar o arquivo a ser pesquisado
			cTxt := MemoRead(aDir[i,1])
			
			//-- Contar o número de aparições da string dentro do arquivo
			nCount :=  StrCharCount(cTxt,cPesquisa)      
			
			//-- Se houver alguma aparição da string no arquivo
			If nCount > 0
				
				//-- Inicializar em zero para quando trocar o arquivo não gerar erro
				nPos := 0
				
				//-- Rodar o arquivo pesquisando a posição de cada aparição
				For j := 1 to nCount
				
					//-- Obter a posição da string no arquivo
					nPos := At(cPesquisa,cTxt, nPos)
					
					//-- Adicionar para o resultado o nome do arquivo e a posição onde se encontra a string
					aAdd(aResult,{aDir[i,1], nPos})
				
				end//For j := 1 to nCount
			
			end//If nCount > 0
			
		end//If Empty(cTipoArquivo) .Or. ( cFileExt(MemoRead(aDir[i,1])) $ cTipoArquivo )
		
	end//For i := 1 to Len(aDir)

Return aResult


Busca String em Arquivo TXT

Enviado: 30 Mar 2012 10:47
por asimoes
Ola Sambomb,

Essas funções:

StrCharCount()
cFileExt()


são de de que lib?

Busca String em Arquivo TXT

Enviado: 30 Mar 2012 15:19
por sambomb
São do Fivewin até onde eu sei.

Busca String em Arquivo TXT

Enviado: 31 Mar 2012 15:38
por rochinha
Amiguinho,

Faça uma adaptação desta para contar strings em seu codigo:

Código: Selecionar todos

function Ocorrencia(pString,PCHAR)
   nString := 0
   for I = 1 to len(pString)
       if substr(pString,I,1) = PCHAR
          nString := nString + 1
       endif
   next
   return nString

Busca String em Arquivo TXT

Enviado: 31 Mar 2012 19:43
por Clipper
Aproveitando...

A muito tempo fiz a função abaixo para ajudar um colega aqui do fórum, ela pesquisa a ocorrência de uma string em qualquer tipo de arquivo e faz a troca por outra caso seja necessário, não importa o tipo de arquivo, pode ser TXT, EXE, DBF, INI, etc. Vale ressaltar que para arquivos grandes a função fica um pouco lenta já que ela faz uma busca byte a byte.

Código: Selecionar todos

*** Pesquisa a existência de um determinado texto dentro de um arquivo
*** O arquivo pode ter qualquer extensão
***
*** Parâmetros
*** cArq = Nome do arquivo a ser pesquisado
*** cPesq = Cadeia a ser pesquisada 
*** cTroca = Caso seja informado ao encontrar a sequencia sera feita a troca 
*** Obs : Se a nova string for menor que a pesquisada então a diferença
***  : sera preenchida com espaços
***
*** Retorno :
*** Retorna a quantidade de ocorrências
*** Em caso de erro retorna -1, -2 ou -3 dependendo do erro
***
*** Alterada em : 11.02.2008 as 14:29 horário de Brasília
*** A pesquisa agora e feita do 1º byte em diante
*** A função agora nao diferencia maiúsculas de minusculas
***
*** Obs : Na pesquisa tanto faz se e maiúscula ou minúscula
***   porém no caso da nova string vale como ela foi passada
***   Ex : Se a nova string for "BaRtOlomEU" assim ela sera gravada
***
*** Contribuições : Maligno e Eolo
*** 
*------------------------------------*
 Function PesqByte(cArq,cPesq,cTroca)
*------------------------------------*
if cArq=nil .or. cPesq=nil // Falta de parâmetros
 return(-1)
endif
cPesq=alltrim(cPesq)
if cTroca<>nil
 cTroca=Alltrim(cTroca)
 if len(cPesq)<len(cTroca) // String  pesquisada menor que nova string
   return(-2)
 endif

 if len(cPesq)>len(cTroca) // a nova string e menor que pesquisada então
   espacos=len(cPesq)-len(cTroca) // a diferença sera preenchida com espaços
   cTroca=cTroca+space(espacos)
 endif
endif
if .not. file(cArq) // Arquivo não encontrado
 return(-3)
endif
pl=upper(substr(cPesq,1,1))
hand=fopen(cArq,2)
Byte=1
Tamanho=fseek(hand,0,2)
posiciona=fseek(hand,0,0)
conta=0
do whil .T.
 lebyte=freadstr(hand,1)
 if upper(lebyte)=pl
   posiciona=fseek(hand,-1,1)
   leu=freadstr(hand,len(cPesq))
   if upper(leu)=upper(cPesq)
    conta++
    if cTroca<>nil
      fseek(hand,-len(cPesq),1)
      fwrite(hand,cTroca,len(cTroca))
    endif
   endif
 endif
 byteatual=fseek(hand,1,-1)
 byte++
 if byte>=tamanho-len(cPesq)+1
   fclose(hand)
   return(conta)
 endif
enddo
O post original é :

viewtopic.php?f=1&t=7471&start=0&hilit=busca+string

Até logo.

Marcelo