Busca String em Arquivo TXT

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

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Busca String em Arquivo TXT

Mensagem 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.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Busca String em Arquivo TXT

Mensagem 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
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)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Busca String em Arquivo TXT

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
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

Busca String em Arquivo TXT

Mensagem 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

Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Busca String em Arquivo TXT

Mensagem por asimoes »

Ola Sambomb,

Essas funções:

StrCharCount()
cFileExt()


são de de que lib?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
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

Busca String em Arquivo TXT

Mensagem por sambomb »

São do Fivewin até onde eu sei.
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Busca String em Arquivo TXT

Mensagem 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
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Busca String em Arquivo TXT

Mensagem 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
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Responder