Função para pesquisar e trocar texto qquer tipo de arquivo
Enviado: 10 Fev 2008 16:30
Prezados Colegas
Fiz uma funçãozinha para ajudar num post e acabei fazendo essa genérica para disponibilizar para os colegas.
Essa função faz uma pesquisa Byte a Byte por um cadeia de caracteres e com a opção de efetuar a troca por outra cadeia, pode ser usada em arquivo com qualquer extensão.
Dependendo do tamanho do arquivo essa pesquisa pode demorar um pouco, no teste que fiz com um arquivo de 4 MB demorou 43 segundos, em pesquisas com arquivos grandes é interessante colocar uma barra de progresso ou algo parecido.
Um exemplo clássico onde ela pode ser aplicada :
Digamos que existam vários arquivos PRG dentro de um diretório e que se deseja pesquisar em todos eles e trocar a cadeia DBFNTX por DBFCDX, o uso seria assim :
AEVAL(DIRECTORY("*.PRG"),{|AFILE|PESQBYTE(AFILE[F_NAME],"DBFNTX","DBFCDX")})
Lembrando que como é uma pesquisa byte a byte é Case sensitive (faz a diferença entre letras maiusculas e minusculas)
Segue abaixo o código :
Até logo.
Marcelo
Fiz uma funçãozinha para ajudar num post e acabei fazendo essa genérica para disponibilizar para os colegas.
Essa função faz uma pesquisa Byte a Byte por um cadeia de caracteres e com a opção de efetuar a troca por outra cadeia, pode ser usada em arquivo com qualquer extensão.
Dependendo do tamanho do arquivo essa pesquisa pode demorar um pouco, no teste que fiz com um arquivo de 4 MB demorou 43 segundos, em pesquisas com arquivos grandes é interessante colocar uma barra de progresso ou algo parecido.
Um exemplo clássico onde ela pode ser aplicada :
Digamos que existam vários arquivos PRG dentro de um diretório e que se deseja pesquisar em todos eles e trocar a cadeia DBFNTX por DBFCDX, o uso seria assim :
AEVAL(DIRECTORY("*.PRG"),{|AFILE|PESQBYTE(AFILE[F_NAME],"DBFNTX","DBFCDX")})
Lembrando que como é uma pesquisa byte a byte é Case sensitive (faz a diferença entre letras maiusculas e minusculas)
Segue abaixo o código :
Código: Selecionar todos
*** Pesquisa a existencia de um determinado texto dentro de um arquivo
*** O arquivo pode ter qualquer extensao
***
*** 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
***
*** Retorno :
*** Retorna a quantidade de ocorrencias
*** Em caso de erro retorna -1, -2, -3 ou -4 dependendo do erro
***
*** Modificado em 10.02.2007 as 21:37 Horário de Brasilia
*** Adicionada Verificação de duplicidade de parametros
*** Por sugestão do Colega Eolo
*------------------------------------*
Function PesqByte(cArq,cPesq,cTroca)
*------------------------------------*
if cArq=nil .or. cPesq=nil // Falta de parametros
return(-1)
endif
if cTroca<>nil
if len(cPesq)<>len(cTroca) // Tamanhos diferentes
return(-2)
endif
endif
if .not. file(alltrim(cArq)) // Arquivo nao encontrado
return(-3)
endif
if alltrim(cPesq)=alltrim(cTroca) // Igualdade de parametros
return(-4)
endif
hand=fopen(cArq,2)
Byte=1
Tamanho=fseek(hand,0,2)
posiciona=fseek(hand,0,0)
conta=0
do whil .T.
leu=freadstr(hand,len(cPesq))
if leu=cPesq
conta++
if cTroca<>nil
fseek(hand,-len(cPesq),1)
fwrite(hand,cTroca,len(cTroca))
endif
endif
byteatual=fseek(hand,-len(cPesq)+1,1)
byte++
if byte>=tamanho-len(cPesq)+1
fclose(hand)
return(conta)
endif
enddo
Marcelo