Manipulação de arquivo .txt

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

trooper7
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 19 Fev 2010 12:22
Localização: Ribeirão Preto/SP

Manipulação de arquivo .txt

Mensagem por trooper7 »

Olá pessoal, boa tarde.

Possuo um arquivo .txt no modelo deste a seguir:

Código: Selecionar todos

"1","1","53.606.869/0001-40","02.801.096/0001-12","1.912.01","158","158","55","NFE"," ","01/04/11","01/04/11"
"3","10260311","1,00","18.036,00","000","1","0,00","0,00","0,00","18.036,00","0,00","0,00","0,00","0,00","0,00"
"1","1","53.606.869/0001-40","07.546.689/0001-01","1.551.01","180","180","55","NFE"," "
"3","10260311","1,00","18.036,00","000","1","0,00","0,00","0,00","18.036,00","0,00","0,00","0,00","0,00","0,00"
"3","10260311","1,00","18.036,00","000","1","0,00","0,00","0,00","18.036,00","0,00","0,00","0,00","0,00","0,00"
"1","1","53.606.869/0001-40","07.546.689/0001-01","1.551.01","180","180","55","NFE"," "
Preciso fazer uma função que identifique a posição, por exemplo, número 8 de todas as linhas que forem tipo "3" (que se iniciam com 3).
As posições são incrementadas a cada ' "," ' e as linhas são incrementadas a cada chr(13) (quebra de linha).
Portanto, consegui fazer uma função que conta o número de linhas e de posições:

Código: Selecionar todos

xvar=memoread("entradas.txt")
xc=1
xpos=1
xlin=1
do while xc<=len(xvar)
    if substr(xvar,xc,"3")='","'
		xpos=xpos+1
    endif
    if substr(xvar,xc,"1")=chr(13)
		xlin=xlin+1
    endif
xc=xc+1
enddo
clear

@ 00,00 say xpos
@ 00,20 say xlin
Agora peço a ajuda de vocês, como consigo identificar e trocar somente os valores de uma posição específica neste arquivo?
Creio que devo utilizar a função memowrit() para gravar, mas meu problema está em identificar a posição e trocar seu valor.

Agradeço desde já a ajuda de todos!

Abraços!
"É comum vermos os homens zombarem do que não podem compreender." (Goethe)
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Manipulação de arquivo .txt

Mensagem por Pablo César »

Não é uma solução do tipo canônica (como acostuma dizer o nosso benemérito colega Maligno) mas poderia importar o txt para um dbf, deletar os registros que não comecem com "3" e varrer registro por registro que atenda tal condição podendo até mesmo utilizar "8" $ campo_do_dbf e ao encontrá-lo substituir o conteúdo do registro em variavel com a função STRTRAN()
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Manipulação de arquivo .txt

Mensagem por ANDRIL »

Para se ter uma idéia, veja esta manipulação usando o seu arquivo texto que foi postado.

Código: Selecionar todos

/*
	Programador: Anderson
	Uso........: exemplo para manipulacao de dados arquivo txt
   Destino....: Forum PcToledo
*/

cls
arq1="teste.txt"

string=memoread(arq1)
nLinhas=mlcount(string,150)
aEscolha:={}

if empty(string)
	? "arquivo vazio"
	return
endif

for i=1 to nLinhas 
  aadd(aEscolha,memoline(string,150,i))
next
do while .t.
@23,00 say padc("ENTER=Edita linha    [ESC]=Sair",79) colo "w+/n"

ponteiro=achoice(10,01,20,78,aEscolha)
	if lastkey()=27
	exit
	elseif lastkey()=13
		carrega('","')
	endif
enddo

/* cria o arquivo atualizado */

arqsaida="saida.txt"
hd=fcreate(arqsaida)
if hd>0
	for i=1 to len(aEscolha)
		fwrite(hd,aEscolha[i]+chr(13)+chr(10))
	next
	fclose(hd)
	@24,00 say"Arquivo atualizado: "+arqsaida
else
	@24,00 say"Nao foi possivel criar o arquivo modificado: "+arqsaida
endif
quit

***************************************************************************
function carrega(separador)
local aEdit:={}, string:=aEscolha[ponteiro],nPos:=0,retorno,var
***************************************************************************
cls
do while nPos<=len(string)
	nPos=at(separador,string)
	if nPos>0
		//aadd(aEdit,substr(string,0,nPos-1))
		//string=substr(string,nPos+1)
		aadd(aEdit,substr(string,0,nPos))
		string=substr(string,nPos+len(separador)-1)
	else
	if len(string)>0
	 	aadd(aEdit,substr(string,0,len(string)))
	endif
	exit
	endif
	
	
enddo
do while .t.
@23,00 say padc("ENTER=Edita linha    [ESC]=Sair",79) colo "b+/n"
ponteiro2=achoice(10,01,20,78,aEdit)
	if lastkey()=13
		var=strtran(aEdit[ponteiro2],'"',"")
		setcursor(3)
		@24,00 say "Editando: " get var
		read
		setcursor(0)
		if lastkey()!=27
			aEdit[ponteiro2]='"'+alltrim(var)+'"'
		endif
		@24,00 clea 
	elseif lastkey()=27
	exit
	endif
enddo
retorno='"'
for i = 1 to len(aEdit)
	retorno+=alltrim(strtran(aEdit[i],'"',""))+separador
next
retorno=left(retorno,len(retorno)-len(separador))+'"'
aEscolha[ponteiro]=retorno
cls
clea type
return
Agora adapte a sua necessidade.
Abraços.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Manipulação de arquivo .txt

Mensagem por Pablo César »

Só tem um detalhe: Em Clipper, tem que ser levado em consideração a limitação de 64K para as funções MEMOREAD
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Manipulação de arquivo .txt

Mensagem por billy1943 »

Em vez de usar a função MEMOREAD, uma boa opção, no Clipper, é usar a função FILEREAD da lib SUPER, que permite a verificação de arquivos textos de qualquer tamanho.

Eu a uso em meus sistemas para verificação, em tela, de relatórios gerados em forma de SPOOL, o que permite entre outras coisas, uma grande economia de papel.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Manipulação de arquivo .txt

Mensagem por Gilberto M Silva »

Billy, vc poderia disponibilizar a lib SUPER, eu tenho essa lib so que da erro quando compilo no 5.2, da uma mensagem que a lib é para summer'87,
estou tentando copiar o SINTEGRA.TXT gerado pela impressora DARUMA para um DBF utilizando a rotina abaixo:

Código: Selecionar todos

Sele a
use Sintegr
DTINICI:=date()
CARQUIVO:=MEMOREAD("SINTEGRA.TXT")
NLINHAS :=MLCOUNT(CARQUIVO)
FOR i=1 TO NLINHAS
   CLINHA := FILEREAD(CARQUIVO,,i)
   append blank
   repl DATAMOV with DTINICI
   repl DESCRIC with CLINHA
next
Só que não copia a linha completa, copia uma parte da linha num registro e outra parte em outro conforme os arquivos anexos SINTEGRA.TXT e SINTEGRA1.TXT(arquivo gerado apartir do DBF)
Anexos
SINTEGRA1.TXT
Arquivo gerado apartir do DBF
(26.75 KiB) Baixado 169 vezes
SINTEGRA.TXT
Arquivo gerado direto pela impressora que será importado para o DBF
(6.37 KiB) Baixado 186 vezes
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Avatar do usuário
Gilberto M Silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 230
Registrado em: 13 Mar 2007 18:00
Localização: Natal-RN / Parelhas(RN) / Natal(RN)
Contato:

Manipulação de arquivo .txt

Mensagem por Gilberto M Silva »

Pessoal, resolvi pesquisando aqui no forum, da seguinte forma:

Código: Selecionar todos

SELE B
use sintegr
SELE C
USE SINTTEMP EXCLUSIVE
ZAP
APPEND FROM SINTEGRA.TXT SDF
GO TOP
DO WHILE !EOF()
   CLINHA:=DESCRIC
    SELE B
   APPEND BLANK
   repl DATAMOV with DTINICI
   repl DESCRIC with CLINHA
   SELE C
   SKIP
ENDDO
criei um arquivo dbf temporário com um registro depois gravo no sintegr.dbf.
Gilberto[]
A cada conversasão realizada conquistamos mais amigos, isto é um lucro inestimável
Clip5.2 DBFCDX
marcolinosilva@click21.com.br gmarcolinosilva@hotmail.com / Skype:gilberto.marcolino
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Manipulação de arquivo .txt

Mensagem por rochinha »

Amiguinhos,

Voce até começõu certo ao ler o arquivo mas len não era a forma correta de retornar a voce o numero de linhas, pois o mesmo iria retornar o numero de caracteres do arquivo.

Neste caso como cada linha já possuia um carriage return voce poderia usar mlcount() como apresentado nas respostas.

E ai só então ir contando as linhas e criticando cada uma.

Como as linhas que possuem 1 contém registros diferentes das linhas que contém 3 voce teria de elaborar mais a leitura.

Mais uma ajuda:

Código: Selecionar todos

   cLargura := 100 // suponho que seria a largura máxima de cada linha
   cText := MEMOREAD( "SINTEGRA.TXT" )
   nLines := MlCount(cText,nLargura)
   FOR nFor := 1 TO nLines
          // cada linha seria lida e salva na variável cLine
          cLine := MemoLine( cText, nLargura, nFor )
          // fazendo uma limpeza na string capturada retirando as aspas duplas
          cLine := strTran( cLine, ["], []  )
          // transformando a string resultante em um vetor
          aLine := StringToArray( cLine, "," ) // o segundo parametro define qual o separador de elementos 
          // criticamos então o conteúdo ja que o vetor contem apenas um item
          if aLine[1] = "3"
              // processo alguma ação
              ? aLine[8] // conteudo da posicao 8
          endif
   NEXT

function StringToArray( cString, cSeparator ) 
   LOCAL nPos 
   LOCAL aString := {} 
   DEFAULT cSeparator := ";" // se o segundo parametro nao for passado assume ;
   cString := ALLTRIM( cString ) + cSeparator 
   DO WHILE .T. 
      nPos := AT( cSeparator, cString ) 
      IF nPos = 0 
         EXIT 
      ENDIF 
      AADD( aString, SUBSTR( cString, 1, nPos-1 ) ) 
      cString := SUBSTR( cString, nPos+1 ) 
   ENDDO 
   RETURN ( aString ) 
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
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Manipulação de arquivo .txt

Mensagem por billy1943 »

Para os clippeiros de plantão vou colocar em DownLoads a SUPER.LIB, porém renomeada para SUPER.TXT.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Manipulação de arquivo .txt

Mensagem por Pablo César »

Existem vários exemplos aqui no fórum que servem para ler arquivos linha a linha, por exemplo:

https://pctoledo.org/forum/viewto ... nha#p66652
https://pctoledo.org/forum/viewto ... PEN#p29317

A melhor opção é ler e manipular os dados em baixo nível com as funções FOPEN, FREAD, FWRITE...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder