Arquivo TXT

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

marsp
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 11 Fev 2013 14:09

Arquivo TXT

Mensagem por marsp »

Boa tarde.

Como preencher nas 2 ultimas posições de cada linha de um arquivo TXT com asc(13) + ASC(10), como assinalado na pagina 1 e 3 do arquivo anexado.



Obrigado
Anexos
ISSWeb_layout.pdf
(516.31 KiB) Baixado 602 vezes
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Arquivo TXT

Mensagem por Jairo Maia »

Olá marsp,

Em Clipper acho que mais fácil seria dessa forma:

Código: Selecionar todos

Local cLinha

SET DEVICE TO PRINTER
SET PRINTER TO "Teste.Txt"

@ pRow()+0, 0 Say "Teste de linha texto 1"
@ pRow()+1, 0 Say "Teste de linha texto 2"
@ pRow()+1, 0 Say "Teste de linha texto 3"
@ pRow()+1, 0 Say "Teste de linha texto 4"

SET DEVICE TO SCREEN
SET PRINTER TO

RUN Teste.txt
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)
marsp
Usuário Nível 1
Usuário Nível 1
Mensagens: 46
Registrado em: 11 Fev 2013 14:09

Arquivo TXT

Mensagem por marsp »

Obrigado Jairo por responder.

Mas o que quero, é que nas 2 ultimas posições (79 e 80) de uma linha por exemplo de 80 caracteres dentro de um arquivo texto seja preenchido com 2 caracteres que represente o asc(13) e asc(10) ou chr(13) e chr(10).
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Arquivo TXT

Mensagem por Jairo Maia »

Olá Marsp,

Da forma que coloquei, ele faz isso. a sequência de caracteres Chr( 13 ) + Chr( 10 ) representa a quebra de linha e retorno de carro. Isso é o que está dizendo seu leiaute. a Linha precisa ser finalizada com os caracteres para Windows, que são esses.

Ou você já tem um texto retilíneo e quer quebrar as linhas?
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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo TXT

Mensagem por JoséQuintas »

Há diversas formas, depende de como vai gerar o txt.

Código: Selecionar todos

SET ALTERNATE TO TEXTO.TXT
SET ALTERNATE ON
SET CONSOLE OFF
?? "sxxxx" + "XXXXX" + Chr(13) + Chr(10)
SET CONSOLE OFF
SET ALTERNATE OFF
SET ALTERNATE TO
que pode ser melhorado usando função ou #define

Código: Selecionar todos

#define CRLF Chr(13) + Chr(10)

?? "Texto" + CRLF
?? "outro texto" + CRLF

?? "Texto" + CrLf()
?? "outro texto" + CrLf()

FUNCTION CrLf()
   RETURN Chr(13) + Chr(10)
Tem também fOpen(), fWrite(), que grava em disco.
Tem esse que foi mencionado.

Dependendo da opção, pode ser necessário no final fOpen(), fSeek(), fWrite() pra eliminar o Chr(26) que indica fim de arquivo, pra ficar compatível com Windows.

Se o arquivo ficar limitado a 64kb, que é o limite do Clipper pra string, pode criar em TXT e gravar no final.

Código: Selecionar todos

cTxt := ""
cTxt += "linha1" + CrLf()
cTxt += "linha2" + CrLf()
MemoWrit( "texto.txt", cTxt )
E por aí vai.
No caso de #define, o CRLF é substituído por Chr(13) + Chr(10), o que deixa o EXE grande.
No caso de função CrLf(), pode reduzir o tamanho do EXE, por eliminar todos os Chr(13)+Chr(10) que existiriam nos fontes.
Se preferir, pode até usar como nome hb_Eol() que é o mesmo usado no Harbour, assim o fonte fica pronto pra Harbour.

Lembrando que isto também é possível

Código: Selecionar todos

?? "texto"
? "outro texto"
?
?? indica que a saída será em sequência ao texto atual
? indica que vai pular uma linha ANTES do texto atual
Por isso, pra não ter uma linha em branco no início, o primeiro tem que ser ??
E um ? no final pra encerrar a última linha
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo TXT

Mensagem por JoséQuintas »

Pra ilustrar, uma geração de NFE em txt, que tenho aqui:

Código: Selecionar todos

#define FO_READWRITE 2
#define FS_END 2

   SET ALTERNATE TO ( mTxtNfe )
   SET ALTERNATE ON
   SET CONSOLE OFF
   ?? "NOTA FISCAL"
   ?? mTraco
   ?? "1" // Qtde de notas fiscais no arquivo
   ?? mTraco
   ?? " "
   ?? hb_eol()

   mChaveDigital := ;
      "35" + ; // UF Ibge
	  Substr( Dtos( Date() ), 3, 4 ) + ; // AnoMes
	  SoNumeros( mECnpj ) + ; // Cnpj
	  "55" + ; // Modelo de Docto Fiscal
	  "001" + ; // Serie Docto Fiscal
	  StrZero( notas->Nf, 9 ) + ; // NF
     "1" + ;
	  Right( StrZero( notas->Cod, 10 ), 3 ) + StrZero( notas->Cod, 5 ) // Chave Aleatoria
   mChaveDigital := mChaveDigital + CalculaDigito( mChaveDigital, "11" )

   // ---------- (NOTAFISCAL-A)

   ?? "A"
   ?? mTraco
   ?? "3.10" // 1 a 4 digitos versao do layout
   ?? mTraco
   ?? "NFe" + mChaveDigital // na exportação vai ser seguido da chave digital, na importação tanto faz se tem chave digital
   ?? mTraco
   ?? " "
   ?? hb_eol()
...
   SET CONSOLE ON
   SET ALTERNATE OFF
   SET ALTERNATE TO

   // Deixa Ctrl-Z no final da ultima linha

   mHandle := fOpen( mTxtNfe, FO_READWRITE )
   FSeek( mHandle, -3, FS_END )
   fWrite( mHandle, "   " )
   fClose( mHandle )

Ah sim, pra deixar Chr(13) + Chr(10) exatamente na posição 80, se a linha não tem 80 colunas, talvez assim:

Código: Selecionar todos

cTexto := ""
cTexto += "campo1"
cTexto += "Campo2"
?? Pad( cTexto, 80 ) + hb_Eol()
...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo TXT

Mensagem por JoséQuintas »

E uma geração do Itaú, onde preferi colocar observação no início da linha pra indicar posição no txt.
Pode ser interessante pra procurar problema depois.

Código: Selecionar todos

   /* 001 */ cTxt +=  "0"
   /* 002 */ cTxt +=  "1"
   /* 003 */ cTxt +=  "REMESSA"
   /* 010 */ cTxt +=  "01"
   /* 012 */ cTxt += Pad( "COBRANCA", 15 )
   /* 027 */ cTxt += cBancoAgencia
   /* 031 */ cTxt += "00"
   /* 033 */ cTxt += Substr( cBancoConta, 1, Len( cBancoConta ) - 1 )
   /* 038 */ cTxt += Substr( cBancoConta, Len( cBancoConta ), 1 )
   /* 039 */ cTxt += Space(8)
   /* 047 */ cTxt += cEmpresaNome
   /* 077 */ cTxt += cBancoCodigo
   /* 080 */ cTxt += cBancoNome
   /* 095 */ cTxt += StrZero( Day( dDataProcesso ), 2 ) + StrZero( Month( dDataProcesso ), 2 ) + StrZero( Year( dDataProcesso ) - 2000, 2 )
   /* 101 */ cTxt += Space(294)
   /* 395 */ cTxt += StrZero( nSequencial++, 6 )
   cTxt += hb_eol()
Nota: Valem no Clipper 5.x e no Harbour. No caso do Clipper, só criar a função hb_Eol() como já coloquei antes.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Arquivo TXT

Mensagem por Nascimento »

amigo quintas como faz para deixar alinhados os valores?

por exemplo "123" + Spac(02)+trans(1000,"@E999.99")

se eu diminuir o 123 por so "12" o valor desalinha indo para o lado esquerdo

como fazer dessa forma que vc fez mais como coluna fixa ? por exemplo:

Código: Selecionar todos

linha:= PRow()

      @ linha,  7 say grupo + sub_grupo + codigo + ;
                   "-" + SubStr(produto, 1, 26) picture "@!"
                @ linha, 42 say preco / qtd picture "9,999.99"  // aqui sempre vai estar na linha 42, tem como fazer isso usando o exemplo seu citado a cima?

mesmo que um valor se altere as colunas fiquem "fixas" acho que deu pra entender
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Arquivo TXT

Mensagem por Itamar M. Lins Jr. »

Olá!
Use a função pad("campo variavel",30). Fixa o campo variável em 30

Saudações,
Itamar M. Lins Jr
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo TXT

Mensagem por JoséQuintas »

Código: Selecionar todos

trans(1000,"@E999.99")
Isso daí é transformar 1.000 em só 3 dígitos.... tá certo isso?

Essa integração é com ponto decimal, vírgula, ou nenhum dos dois?
Geralmente txt é com zeros e sem vírgula/ponto.

Código: Selecionar todos

StrZero( 1000.00 * 100, 6 )
O Transform com @E, é com espaço depois do E, mas vai usar vírgula ao invés de ponto.
Confirme como deve ser o txt.

StrZero( 1000, 4, 2 )
StrZero( 1000, 6, 2 )
StrZero( 1000 * 100, 6, 2 )
Str( 1000, 4, 2 )

Confirmar:
1 - Se é ponto, vírgula, ou números sem decimais multiplicado por 100/
2 - Se é com espaços em branco ou se com zeros.
3 - Confirmar o tamanho, porque usou um tamanho menor que o número

Ah sim, o transform() também acrescenta separação de milhar, além das decimais, o que dá mais um caractere.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Arquivo TXT

Mensagem por JoséQuintas »

Pegando seu exemplo

Código: Selecionar todos

@ linha,  7 say grupo + sub_grupo + codigo + ;
   "-" + SubStr(produto, 1, 26) picture "@!"
@ linha, 42 say preco / qtd picture "9,999.99"  // aqui sempre vai estar na linha 42, tem como fazer isso
Pra não fazer conta:

Código: Selecionar todos

Pad( 
   Space(7) + 
   grupo + 
   sub_grupo + 
   codigo 
   + "." 
   +  Substr( PRODUTO, 1, 26 )
, 42 )
+ Transform( preco / qtd, "9,999.99" )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder