Pesquisar e trocar strings em qualquer tipo de arquivo

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Pesquisar e trocar strings em qualquer tipo de arquivo

Mensagem por Clipper »

Código: Selecionar todos

*** Pesquisa a existencia de um determinado texto dentro de um arquivo
*** O arquivo pode ter qualquer extensao (prg,exe,com,dll,txt,etc...)
***
*** Parametros
*** 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 entao a diferenca
***        : sera preenchida com espacos
***
*** Retorno :
*** Retorna a quantidade de ocorrencias
*** Em caso de erro retorna -1, -2 ou -3 dependendo do erro
***
*** Alterada em : 11.02.2008 as 14:29 horario de Brasilia
*** A pesquisa agora e feita do 1º byte em diante
*** A funcao agora nao diferencia maisusculas de minusculas
***
*** Obs : Na pesquisa tanto faz se e maiuscula ou minuscula
***       porem no caso da nova string vale como ela foi passada
***       Ex : Se a nova string for "BaRtOlomEU" assim ela sera gravada
***
*** Contribuicoes : Maligno e Eolo
*** 
*------------------------------------*
 Function PesqByte(cArq,cPesq,cTroca)
*------------------------------------*
if cArq=nil .or. cPesq=nil // Falta de parametros
   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 entao
      espacos=len(cPesq)-len(cTroca) // a diferenca sera preenchida com espacos
      cTroca=cTroca+space(espacos)
   endif
endif
if .not. file(cArq) // Arquivo nao 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
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