Página 1 de 2
Trocar String - No Clipper Vai no xHb Não.
Enviado: 19 Jan 2009 15:52
por fladimir
Olá Colegas, tenho uma função q troca strings em um arquivo texto, inclusive foi pego e adaptado de uma do Fórum feita pelo colega Marcelo, com ajuda dos colegas Maligno e Eolo.
Agora a mesma função apenas mudando de compilador tem retornos diferentes, no Clipper esta Ok, agora no xHarbour não deu certo, alguém poderia ajudar...
Grato...
Segue abaixo trecho q da para testar...
Código: Selecionar todos
Proc Main
If File("Carne.TXT")
FileCopy("Carne.TXT", "Carne.TMP")
ArqTxt := "carne.tmp"
PesqByte(ArqTxt,"@empresa", "Loja Mae Joana")
PesqByte(ArqTxt,"@endemp", "Rua das Amoreiras, 2040")
PesqByte(ArqTxt,"@cidaemp", "Sertaozinho")
PesqByte(ArqTxt,"@estadoemp", "MT")
PesqByte(ArqTxt,"@foneemp", "65-3331-7070")
PesqByte(ArqTxt,"@codcli", "04152")
PesqByte(ArqTxt,"@nomecli", "Jose Armando Siqueira")
PesqByte(ArqTxt,"@endereco", "Rua Cel. Ponciano, 123")
PesqByte(ArqTxt,"@bairro", "Centro")
PesqByte(ArqTxt,"@cidade", "Sertaozinho")
PesqByte(ArqTxt,"@estado", "MT")
PesqByte(ArqTxt,"@cep", "85456-547")
PesqByte(ArqTxt,"@telefone", "65-3331-5050")
Else
// Não Gera Carne
Endif
Return
*--------------------------------------------------------------------------*
* Funcao para Trocar Strings em qualquer arquivo *
*--------------------------------------------------------------------------*
/*
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) // 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 !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)
// Coloquei para observar como retona diferente algumas variáveis
//cls
//@08,10 say cArq
//@09,10 say cPesq
//@10,10 say lebyte
//@12,10 say pl
//inkey(0)
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
Return
Abaixo, arquivo Carne.TXT
Abaixo o Arquivo Gerado através do exemplo acima compilado em CLIPPER 5.2
Agora se compilo utilizando o xHarbour 0.99.70 q utilizo a algum tempo não dá o mesmo resultado...não sei dizer pq.
Abaixo segue td compactado com o executavel compilado em Clipper, mas tb com o .BC para quem quiser testar no xharbour.
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 20 Jan 2009 09:20
por Eolo
Agora a mesma função apenas mudando de compilador tem retornos diferentes, no Clipper esta Ok, agora no xHarbour não deu certo, alguém poderia ajudar...
Fladimir, explique esses "retornos diferentes", aí fica mais fácil de lhe ajudar. Dê algum exemplo de como era pra sair e como está saindo.
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 20 Jan 2009 10:55
por fladimir
Olá Eolo... obrigado pela atenção... seguinte o q eu quero dizer com retornos diferentes é o seguinte... qdo eu passo a String a ser procurada para a Função PesqByte para ela trocar por outra String se vc descomentar as linhas da Função PesqByte, compilar no Clipper e rodar vai ver q ele vai procurando e trocando caracter por caracter...
Agora se vc simplesmente compilar o mesmo fonte no xHarbour verá q ele não consegue encontrar os mesmos caracteres para substituir, os retornos q aparecem dos mesmo comandos para obter os caracteres a serem substituidos no arquivo texto, não correspondem...
Caso queira ver melhor pegue o codigo q postei junto e descomente as linhas abaixo:
// Coloquei para observar como retona diferente algumas variáveis
//cls
//@08,10 say cArq
//@09,10 say cPesq
//@10,10 say lebyte
//@12,10 say pl
//inkey(0)
Grato....
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 20 Jan 2009 20:37
por Eolo
Fladimir,
Seguinte, antes da procura pela solução do tal erro, esclarece uma coisa.
Imagino que vc tenha um cadastro de nomes num arquivo DBF e aí usa o tal arquivo TXT (com os "@") como uma máscara para imprimir alguma coisa (carnês?), certo? É isso?
Se sim, por que esse passo "a mais", passando pelo TXT com os "@"? Por que vc não pega os valores do DBF e joga DIRETO no TXT final, pronto pra imprimir?
Olhe o exemplo a seguir. Note que é um exemplo. A partir dele, dá pra colocar mais coisas.
Código: Selecionar todos
Proc Main
arq="carne.txt"
hand=fcreate(arq,0)
if !hand>0
?"Incapaz de criar arquivo"
retu
endi
use clientes
go top
erro=.f.
do whil !eof()
if grava(NOME)=.f.
exit
endi
if grava(ENDERECO)=.f.
exit
endi
if grava(alltrim(CIDADE)+" - "+ESTADO)=.f.
exit
endi
if grava(" ")=.f. // linha em branco
exit
endi
if grava(repl("-",50))=.f. // separador de nomes
exit
endi
skip
endd
use
fclose(hand)
if erro=.t.
?"Erro da gravação"
else
* aqui vc manda imprimir o txt
endi
Código: Selecionar todos
function grava(oque)
priv gravou
oque=oque+chr(13)+chr(10)
* quebra de linha
gravou=fwrite(hand,oque)
if gravou=len(oque)
retu .t.
else
retu .f.
endi
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 21 Jan 2009 00:39
por fladimir
Sim Eolo a idéia central é exatamete esta de substituir direto no TXT, mas eu uso um TMP devido nao prejudicar o Layout do Cliente para o Formulario dele pré impresso, tipo a partir do TXT Layout do Formulario Pre-impresso gero um TMP q eh substituida as Strings pelo conteudo do BD e gerado o Arquivo para Impressao, dessa maneira fica flexivel no sentido de tipo independente do cliente mudo soh o TXT sem mudar o PRG servindo para varios fins. Entao utilizo esta funcao pois depois de pesquisar foi a q encaixou blz no sentido de preservar os espacamentos entre um campo e outro... onde debatemos e trocamos muitas ideias no topico abaixo....
https://pctoledo.org/forum/viewto ... &sk=t&sd=a
O problema eh q os mesmo PRG nao esta se comportando da mesma maneira no xHarbour.
Espero ter elucidado mais um pouco do meu problema...
Grato.
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 22 Jan 2009 11:51
por gvc
Este resolve o problema da substituição e é mais simples do que a função que vc usa.
Vc pode mudar para acertar os devidos tamanhos, inclusive mudando tudo para trabalhar com funções.
Lembre que o campo memorando tem tamanho limitado.
Código: Selecionar todos
Proc Main
If File("Carne.TXT")
ctext := memoread("Carne.TXT")
ctext := strtran(ctext, "@empresa", "Loja Mae Joana")
ctext := strtran(ctext, "@endemp", "Rua das Amoreiras, 2040")
ctext := strtran(ctext, "@cidaemp", "Sertaozinho")
ctext := strtran(ctext, "@estadoemp", "MT")
ctext := strtran(ctext, "@foneemp", "65-3331-7070")
ctext := strtran(ctext, "@codcli", "04152")
ctext := strtran(ctext, "@nomecli", "Jose Armando Siqueira")
ctext := strtran(ctext, "@endereco", "Rua Cel. Ponciano, 123")
ctext := strtran(ctext, "@bairro", "Centro")
ctext := strtran(ctext, "@cidade", "Sertaozinho")
ctext := strtran(ctext, "@estado", "MT")
ctext := strtran(ctext, "@cep", "85456-547")
ctext := strtran(ctext, "@telefone", "65-3331-5050")
memowrit("carne2.tmp", ctext)
Else
alert('Arquivo Nao Encontrado!!!')
Endif
Return
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 22 Jan 2009 16:36
por fladimir
gvc.. obrigado pela atencao... mas pelo q entendi a sua idéia era exatamente o q eu usava, algum tempo atras... mas por favor de uma rapida olhada no tópico em q eu debati esse assunto, com base em praticamente o mesmo codigo q vc exemplificou, onde eu tinha problemas... exatamente com a questao do tamanho dos campos..
https://pctoledo.org/forum/viewto ... &sk=t&sd=a
Grato...
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 23 Jan 2009 08:43
por gvc
Vc pode resolver isso com padr na hora de substituir as strings.
Se vc tem um caracter marcador de final de linha, vc pode usar o stuff para apagar os espaços excedentes.
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 23 Jan 2009 21:03
por fladimir
Obrigado gvc pela atenção... vou testar e depois posto os resultados...
Vlw...
Sucesso!!!!
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 11 Abr 2009 14:28
por sygecom
Olá Fladimir,
Nós de mais detalhes o que não esta acontecendo que deveria acontecer. Não entendi muito bem onde esta dando o problema.
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 13 Abr 2009 23:17
por fladimir
Entao Leonardo vamos lá... a questao eh q quero q o PesqByte q funciona no clipper funcione no xHarbour, qdo compilo no xHarbour nao da erro nenhum acontece q tb nao faz nada com o arquivo texto base q tem as TAG's ele gera um arquivo final igual ao BASE ou seja nao funciona como no Clipper.
Como eu disse no inicio do topico se vcs baixarem o arquivo compactado chamado TUDO lah tera o fonte o arquivo TXT base e o makefile q estou usando e tb o EXE compilado em clipper, ou seja, se vc baixar o TUDO.RAR e rodar o Executavel vera q sera gerado um arquivo chamado CARNE.TMP preenchido ao inves das TAG's e se compilar no xHarbour, tipo eu faço assim: hbmake xxxx.bc , ai ele gera um Executavel compilado no xHB e rodando o mesmo ele gera um CARNE.TMP IGUAL ao CARNE.TXT (Base), não sei o q pode estar ocorrendo, e preferia nao ter q mudar a Função PESQBYTE, pois ela nao mexe na posicao do Texto ou seja se tiver uma TAG chamada:
ela preenche certinho sem jogar o Dt. Nasc pra frente mesmo se o nome do cliente for: Joao da Silva ou se for Jose Joao da Silva, e é isso q desejo nao bagunçar o Layout Origina do arquivo TXT de uma forma pratica assim como no fonte.
Agora caso algum colega tenha alguma idéia tb q de o mesmo resultado e de forma prática, agradeceria, pois no q corresponde trabalhar com Arquivos Texto e TAG's sinceramente, até hj nao entendo direito.
:(Neg
Grato
:)Pos
Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 14 Abr 2009 11:06
por Pablo César
Fladimir, sei que você está precisando resolver este assunto e que o seu assunto foi transferido para esta seção. Mas será que você poderia responder as minhas as questões que levantei lá na seção Clipper também ? Pois eu agora estou com um assunto parecido e talvez aquela questão vá de encontro ao seu problema. Ou prefere que unamos as mensagens referente a este mesmo tópico ?
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 14 Abr 2009 12:39
por fladimir
Olá Plabo, então eu estava tentando de td q eh lado e como tive um retorno lá no seção clipper, fui praquele lado devido tipo tentar mudar da PesqByte para outra q compile no Clipper e no xHB sem mudar o resultado, eu antes tinha tentando aki neste tópico, mas como não tive retorno, até o Leonardo falar para continuarmos aki, então não sei como podemos fazer a nivel de topicos e mensagens, mas na verdade o q eu busco mesmo é tipo a Função PESQByte funcionando no xHarbour e não ter q trocar, ou se tiver, por outra q ofereça a mesma praticidade q tinha com ela no Clipper.
Qto as suas perguntas, me desculpe a sinceridade, mas o problema não é contigo, mas eu não consigo entender direito suas argumentações, tipo qdo na escola aparecia uma questão de Física ou Matemática q a professora explica explica e continuo boiando...
Na verdade se vc pudesse passar uma MP pra eu entrar em contato direto contigo e depois postar os resultados aki, talvez se conversarmos por MSN, Skype ou Tel consiga entender melhor. Desculpe a minha de certa forma não sei esse é o termo, ignorância.
Agradeço muito a vcs q estão se esforçando em me auxiliar, me sinto constrangido de tipo contar com tanto apoio da equipe de moderadores e coleas essa minha cabeça dura não conseguir desenrolar o trem.
Att.
:%
Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?
Enviado: 15 Abr 2009 00:43
por asimoes
Olá Fladmir,
Eu fiz uma versão para ser apreciada por todos, compartilhando minha experiência.
Veja o código e por favor faça o teste.
Código: Selecionar todos
#include "Fileio.ch"
#include "common.ch"
FUNCTION MAIN
LOCAL nLineLen := 150
LOCAL nTabSize := 0
LOCAL lWrap := .F.
LOCAL i, imax, cText, cLine, nOffSet, nTextLen
LOCAL t1, t2, t3
FileCopy("base1-1.txt","arq_des.txt")
aPesq:= {"@empresa",;
"@valor",;
"@cidaemp",;
"@venda",;
"@nomecli",;
"@vcto"}
aTroca:={"EMPRESA NUCLEAR DE COBALTO",;
"200,00",;
"RIO DE JANEIRO",;
"R$ 10,00",;
"ALEXANDRE SIMÕES",;
"31/12/2009"}
SET PRINTER TO TESTE.TXT
SET DEVICE TO PRINT
SET PRINT ON
SETPRC(0,0)
MascaraTXT("arq_des.txt",aPesq,aTroca,150)
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
RETURN
FUNCTION MascaraTXT(cArquivo,aPesq,aTroca,nLineLen,nTabSize,lWrap)
******************************************************************************
* Autor : ALEXANDRE SIMåES *
* Data : ABRIL/2009 *
*----------------------------------------------------------------------------*
* Objetivo : Pesquisar Tags [@] e substituir por outro valor *
******************************************************************************
LOCAL iMax, cText,I
DEFAULT nLineLen TO 150,;
nTabSize TO 0,;
lWrap TO .F.
/*
Ex.:
Copiar o arquivo template para o de trabalho.
FileCopy("arq_ori.txt","arq_des.txt")
Criar os vetores para pesquisa e troca
aPesq :={}
aTroca:={}
ÚÄÄÄÄ 1 - AADD(aPesq,"@empresa")
³ ÚÄÄ 2 - AADD(aPesq,"@valor")
ÀÄÅÄ 1 - AADD(aTroca,"EMPRESA S/A")
ÀÄ 2 - AADD(aTroca,"200,00")
SET PRINTER TO TESTE.TXT
SET DEVICE TO PRINT
SET PRINT ON
SETPRC(0,0)
MascaraTXT(Arq_Des,aPesq,aTroca,150)
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
Obs.: O vetor aTroca deve obedecer a mesma ordem do aPesq
dos dados a serem pesquisados
*/
cText := MemoRead( cArquivo )
Imax := MLCount( cText, nLineLen, nTabSize, lWrap )
aLine:={}
nElemento:=1
FOR I:=1 TO Imax
cLine := MemoLine( cText, nLineLen, I, nTabSize, lWrap )
For nLenLinha:=1 to Len(cLine)
For J:=1 To Len(aPesq)
If aPesq[J] $ cLine
cLine:=STUFF(cLine,AT(aPesq[J],cLine),Len(aTroca[J]),aTroca[J])
EndIf
Next
Next
@ PROW() ,000 Say cLine
@ PROW()+1,000 Say ""
NEXT
RETURN Nil
Re: Trocar String - No Clipper Vai no xHb Não ** RESOLVIDO **
Enviado: 15 Abr 2009 20:53
por fladimir
Primeiramente quero Agradecer a todos os colegas q colaboraram e tiveram paciência com meu problema.
Hj fiz uma pesquisa sobre o tema e acredito q consegui entender um pouquinho sobre TAGs e com as idéias dos colegas e a função do colega Alexandre Simões dei uma modificada no código do colega (sintam-se a vontade para criticar e ou melhorar) e consegui ter a função de acordo com minha necessidade inicial...
O probleminha eh q ela tipo tem q ter um caracter posterior a TAG + ESPACOS + CARACTERDIFERENTEdeESPACO...., tipo se for utilizar em um contrato em q a TAG esteja assim:
@empresa,
@endemp,
Ela entra num Loop Infinito... ai tenho q colocar algum caracter diferente de espaço para ela tipo terminar o preenchimento da TAG exemplo:
@empresa, x
@endemp, *
Ai ela da continuidade... mas como já resolve 90% dos meus problemas, vou olhar isso depois com mais calma afinal já eh madrugada...
Segue abaixo código Original do colega ASIMOES + partes modificadas comentadas...
.
Código: Selecionar todos
#include "Fileio.ch"
#include "common.ch"
FUNCTION MAIN
LOCAL nLineLen := 150
LOCAL nTabSize := 0
LOCAL lWrap := .F.
LOCAL i, imax, cText, cLine, nOffSet, nTextLen
LOCAL t1, t2, t3
FileCopy("base1-1.txt","arq_des.txt")
aPesq:= {"@empresa",;
"@valor",;
"@cidaemp",;
"@venda",;
"@nomecli",;
"@vcto"}
aTroca:={"EMPRESA NUCLEAR DE COBALTO",;
"200,00",;
"RIO DE JANEIRO",;
"R$ 10,00",;
"ALEXANDRE SIMÕES",;
"31/12/2009"}
SET PRINTER TO TESTE.TXT
SET DEVICE TO PRINT
SET PRINT ON
SETPRC(0,0)
MascaraTXT("arq_des.txt",aPesq,aTroca,150)
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
RETURN
FUNCTION MascaraTXT(cArquivo,aPesq,aTroca,nLineLen,nTabSize,lWrap)
******************************************************************************
* Autor : ALEXANDRE SIMåES *
* Data : ABRIL/2009 *
*----------------------------------------------------------------------------*
* Objetivo : Pesquisar Tags [@] e substituir por outro valor *
******************************************************************************
LOCAL iMax, cText,I
DEFAULT nLineLen TO 150,;
nTabSize TO 0,;
lWrap TO .F.
/*
Ex.:
Copiar o arquivo template para o de trabalho.
FileCopy("arq_ori.txt","arq_des.txt")
Criar os vetores para pesquisa e troca
aPesq :={}
aTroca:={}
ÚÄÄÄÄ 1 - AADD(aPesq,"@empresa")
³ ÚÄÄ 2 - AADD(aPesq,"@valor")
ÀÄÅÄ 1 - AADD(aTroca,"EMPRESA S/A")
ÀÄ 2 - AADD(aTroca,"200,00")
SET PRINTER TO TESTE.TXT
SET DEVICE TO PRINT
SET PRINT ON
SETPRC(0,0)
MascaraTXT(Arq_Des,aPesq,aTroca,150)
SET PRINT OFF
SET PRINTER TO
SET DEVICE TO SCREEN
SET CONSOLE ON
Obs.: O vetor aTroca deve obedecer a mesma ordem do aPesq
dos dados a serem pesquisados
*/
cText := MemoRead( cArquivo )
Imax := MLCount( cText, nLineLen, nTabSize, lWrap )
aLine:={}
nElemento:=1
FOR I:=1 TO Imax
cLine := MemoLine( cText, nLineLen, I, nTabSize, lWrap )
For nLenLinha:=1 to Len(cLine)
For J:=1 To Len(aPesq)
If aPesq[J] $ cLine
// Inicio da Modificação da Função do Colega Alexandre Simões, com devidos
// comentários
* Define o TAM da TAG
nTamTAG := Len(aPesq[J])
* Define a Posição Final da TAG
nPosFimTAG := ( AT(aPesq[J],cLine) + nTamTAG )
* Define a Posição Inicial do Prim. Espaço Posterior ao Fim da TAG
nPosInEsp := nPosFimTAG + 2
* Define o Tam. da Cadeia de Caract. q sera Eliminada ;
* Que é Igual ao Tamanho da TAG + Espaços Posteriores a TAG
* com o auxilio da Função: FunConEsp
nTamElimi := nTamTAG + (FunConEsp( cLine, nPosInEsp ) - nPosInEsp )
* Define o q sera inserido na proporção q foi eliminada
OqSeraIns := PADR(aTroca[J],nTamElimi)
* Efetua a Troca da TAG pelo Conteúdo
cLine:=STUFF(cLine,AT(aPesq[J],cLine),nTamElimi,OqSeraIns)
// Final da Modificação da Função do Colega Alexandre Simões
// Linha Original da Função do Alexandre Simões
// cLine:=STUFF(cLine,AT(aPesq[J],cLine),Len(aTroca[J]),aTroca[J])
EndIf
Next
Next
@ PROW() ,000 Say cLine
@ PROW()+1,000 Say ""
NEXT
RETURN Nil
Function FunConEsp( LinhaTXT, PosInEsp )
******************************************************************************
* Autor : Fladimir *
* Data : ABRIL/2009 *
*----------------------------------------------------------------------------*
* Objetivo : * Função para contar qtos espaços tem posteriores a TAG *
******************************************************************************
nPosFinEsp := 0
ForEspaco:=.t.
While ForEspaco =.t.
Eh_Espaco := Substr( LinhaTXT, (PosInEsp), 1 )
IIf( EH_Espaco = " ", PosInEsp++, ForEspaco:=.f.)
End
nPosFinEsp += PosInEsp
Return nPosFinEsp
O meu muito obrigado e SUCESSO a TODOS!!!
:)Pos