Clipper On Line • Ver Tópico - Append from (arqtxt) sdf

Append from (arqtxt) sdf

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Append from (arqtxt) sdf

Mensagempor Alexandre Silva » 17 Jan 2012 01:44

Ola..
Na migracao do clipper para harbour,
para ler um arquivo txt, eu crio uma estrututa em dbf e executo o comando append form (arq.txt) sdf
esse arquivo em txt tem colunas de quase 6000 caracteres, entao defino o dbf com um campo com tamanho 6000
No clipper funcionava beleza
no Harbour 2.0 * que é o que estou usando, apenas a primeira linha do txt é puxada !O que estaria errado ??

.
.
varq:='arquivo.txt'
erase('strut.dbf')
aadd(aCampos,{"reg" ,"C", 6000, 0})
DBCREATE("strut",aCampos)
close('strut')
sele 0
use strut alias strut
SELE STRUT
APPEND FROM &VARQ SDF
dbgotop()
.
.
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 351
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 34 vezes
Mens.Curtidas: 6 vezes

Append form (arqtxt) sdf

Mensagempor Pablo César » 17 Jan 2012 07:55

Apesar de que tem alguma linhas desnecessárias ao meu ver, mas nada que possa afetar. O código não tem nada de errado. Eu compilei aqui e fiz o teste, dir um dir > arquivo.txt só para criar o arquivo txt e funcionou beleza, sem problemas. Bom mas eu usei o Harbour Harbour 2.0.0 (Rev. 13372) que vem no HMG 3.0.035 que é o mesmo Harbour.

Eu acredito que algum caracter especial deve ter nesse arquivo.txt. Você teria que visualizar o conteúdo do arquivo de ser possível utilize um editor decimal ou hexadecimal ou poste ele ou parte dele para podermos avaliar. Eu anexei o executável só para você testa-lo aí só para tirar a dúvida se o seu Harbour possa estar com alguma problema (não conheço relatos disso, mas pelas dúvidas...)
Anexos
teste.rar
(581.94 KiB) Baixado 280 vezes
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Append form (arqtxt) sdf

Mensagempor Alexandre Silva » 19 Jan 2012 12:28

Oi
Fiz o teste com teu aplilcativo e o meu arquivo e só le o primeiro registro..
no clipper funciona..
preciso dessa funcao para pode passar para o Harbour..
Nao tem uma equivalente HB_XXXXXX ??
Anexos
arquivo.txt
(14.88 KiB) Baixado 284 vezes
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 351
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 34 vezes
Mens.Curtidas: 6 vezes

Append form (arqtxt) sdf

Mensagempor Pablo César » 19 Jan 2012 13:24

Oi Alexandre, descobri o que era. No seu arquivo arquivo.txt que você está tentando fazer o APPEND está com finalização de linha com o caracter CHR(10) e não com os caracteres CHR(10)+CHR(13). No Clipper dá certo, mas já no Harbour e xHarbour, precisa definir a constante _SET_EOL, portanto veja como ficaria o seu código:
Function Main
Local aCampos := {}, cSetEOL := SET(_SET_EOL)

varq:='arquivo.txt'
erase('strut.dbf')
aadd(aCampos,{"reg" ,"C", 6000, 0})
DBCREATE("strut",aCampos)
close('strut')
sele 0
use strut alias strut
SET(_SET_EOL,CHR(10)) // Muda o caracter de finalização APPEND de CHR(10)+CHR(13) para CHR(10)
APPEND FROM &VARQ SDF
SET(_SET_EOL,cSetEOL)
dbgotop()
Return
Veja na linha 2, só para guardar o(s) caracter(es) de finalização inicial e na linha 11 é para definir apenas o Chr(10) como finalização. Na linha 13 volta a configuração ao que estava.

Eu me certifiquei de que o caracter de finalização era mesmo Chr(10), é só abrir o arquivo em editor hexadecimal e verá lá na coluna 5078 o caracter como "0A" em Hexadecimal.
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Append form (arqtxt) sdf

Mensagempor Alexandre Silva » 19 Jan 2012 14:38

Perfeito.. funcionou...que coisa.. obrigado mesmo :-Y

Posso deixar setado o eol() para chr(10), para todos os arquivos.. ? o vou ter que ficar editando para ver que tipo de finalizacao é ??
Acho que sim, pois sendo chr(10) ou chr(10)+chr(13) , vai fazer o append..

PS: O assusno deveria ser: append from sdf e nao form , se puder corrigir, fica mais facil para futuras pesquisas
* Clipper 5.2e/Gaspro 4.0 /CDX/Blinker 7.0 Harbour 3.2 Console Hbmk2
Avatar de usuário

Alexandre Silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 351
Data de registro: 26 Mar 2007 00:16
Cidade/Estado: Itapema - SC
Curtiu: 34 vezes
Mens.Curtidas: 6 vezes

Append form (arqtxt) sdf

Mensagempor Pablo César » 19 Jan 2012 16:22

Posso deixar setado o eol() para chr(10), para todos os arquivos.. ? o vou ter que ficar editando para ver que tipo de finalizacao é ??
Eu não faria isso. Editando, não precisa, você pode fazer uma rotina para isso.
Acho que sim, pois sendo chr(10) ou chr(10)+chr(13) , vai fazer o append..
Sim, fazer o APPEND irá fazer mas no final ele irá colocar um caracter "♪" 9irá colocar um caracter estranho, aliás isso poderá implicar em algo mais... melhor não fazer com o eol() fixo.

Olha fiz uma implementação aquele seu código:
Function Main
Local aCampos := {}, cSvSetEOL := SET(_SET_EOL)

varq:='arquivo.txt'
nHandle := FOpen(varq,0)
If nHandle # -1
   cBuff:=SPACE(6000)
   nPos:=FSEEK(nHandle,0,1)
   IF ( nRead:=FREAD(nHandle,@cBuff,6000) ) > 0
      IF ( nEol:=AT(CRLF,SUBSTR(cBuff,1,nRead)) ) == 0
        Alert("Não tem Chr(13)")
       SET(_SET_EOL,CHR(10)) // considera apenas o chr(10)
     ELSE
        Alert("Tem Chr(13)")
       SET(_SET_EOL,chr(13)+CHR(10)) // dai poe
     ENDIF
   ENDIF
Endif
FClose(nHandle)
erase('strut.dbf')
aadd(aCampos,{"reg" ,"C", 6000, 0})
DBCREATE("strut",aCampos)
close('strut')
sele 0
use strut alias strut
APPEND FROM &VARQ SDF
SET(_SET_EOL,cSvSetEOL)
dbgotop()
Return
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Append form (arqtxt) sdf

Mensagempor alxsts » 19 Jan 2012 18:31

Olá!

O Chr(10) é o separador de linhas padrão no Unix e Linux. Já no DOS/Windows é o Chr(13) + Chr(10).

No xHarbour existe uma função que retorna o separador padrão para o sistema operacional: HB_OSNewLine() --> cString
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Append form (arqtxt) sdf

Mensagempor Paulo Pereira » 30 Mai 2012 15:14

Olá
Quando faz um append from sdf, puxo todo o registro para uma linha..
depois vou lendo do começo ao fim procurando pelo ; (ponto e virgula) que separa os campos.

Ocorre que a fonte dos dados que importamos, colocou ; no meio do endereco do cliente
entao fica fora a partir dai ..
Alguem tem uma idéia de como importar ??

Na verdade a fonte do arquivo é um sistema ORACLE, que expota em TSV... (pode ser aberto no EXCELL)
mas como o clipper nao importa TSV, meu cliente abre com excell e salva em CSV...

Como voces fariam para ler um arquivo assim ?? Dá para ler o formato TSV ??
Abrir o anexo com excell, vejam a coluna G, entrega para, ai tem os ;

Nota de Moderação:
por Pablo César: Anexo excluído a pedido do autor desta mensagem.
Paulo Pereira
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 79
Data de registro: 28 Abr 2011 00:29
Cidade/Estado: Joinville / SC
Curtiu: 5 vezes
Mens.Curtidas: 0 vez

Append from (arqtxt) sdf

Mensagempor Pablo César » 30 Mai 2012 18:16

Baixei o seu arquivo p1.csv e analisei o que poderia ser feito. Bom a forma que é gerado, poderia ser mudado para o padrão que o Clipper e qualquer outro método seguro de importação por arquivo texto.

Para que você tenha uma idéia, refiz todo o cabeçalho desse arquivo .csv de forma que ficasse o nome de campo (irei espaços e mantive o tamanho) aí gerei em dbf. Vieram campos do tipo numérico, caracter e data. Perfeito.

Agora temos o dbf com os devidos dados, se bem que obtido através de planilha e manipulação manual para gerar o dbf. Certo que não é exatamente o que você quer. Mas se você fizer um gera.prg com:
use p3
copy to p3 delimited
Você vai obter o seguinte arquivo p3.txt com este conteúdo:
99999,9999999,"110 - Venda p/xxxxxx",99999999,"Pronto para Libera?’","XXXXXXXX DAS LTDA.","999999 : ROD BR-XXXXXSETOR: RODOVIARIO; : LOJAS XXXXX; : SUC ZXXZX;-XXXXXXXXXXX-999999990-BR",31253,"2.1","XXXXXXXTRAns-RodovXXXXXXOutras transporta",20120601,20120601,"XXXX MODAS LTDA.","",9100,"","","906817 : ROD XXXXXX-SETOR: RODOVIARIO; : LOJAS SUC XXX6; : XXXXXXX;-IMPERATRIZ-MA-999999990-BR","21224E","XXXXXXX NUDE 60X60 NAT","",1396,"m2","","01-XXXXXXXXXJE : BR 101 Km163--XTijucas-XXC-880999990-BR_","XX","","","","","099999999/0099-99..99999 - XXXXXXXA RODXXXXX NOVO.FSDF6D\SFGDFS1GDFG1GFD112.FOB."
Observe que o Clipper criou o arquivo com aspas duplas quando é campo do tipo caracter e cada campo está separado por "," (vírgula). Então é desse modo que você deveria pedir para os programadores em ORACLE para que gerem nesse formato:
DELIMITED Text File Format Specifications
────────────────────────────────────────────────────────────────────────
File Element        Format
────────────────────────────────────────────────────────────────────────
Character fields    Delimited, with trailing blanks truncated
Date fields         yyyymmdd
Logical fields      T or F
Memo fields         Ignored
Numeric fields      Leading zeros truncated
Field separator     Comma
Record separator    Carriage return/linefeed
End of file marker  1A hex or CHR(26)
────────────────────────────────────────────────────────────────────────
Depois você poderia ler o arquivo linha a linha, através de funções de baixo nível (FOPEN/FREAD) e desdobrar cada campo em sequência separadas por "," e aspas.

Nota de Moderação:
por Pablo César: Dados re-editados para proteger informação do cliente.
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Append from (arqtxt) sdf

Mensagempor Pablo César » 31 Mai 2012 14:28

Paulo Pereira (em MP) escreveu:Interessante que nao se ve com o excell
Pois é... ao menos que logo após ter importado o arquivo, você venha a fazer uma cópia desse dbf mas com extensão xls. Daí vai abrir...
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 de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Append from &arquivo.+"2"

Mensagempor microvolution » 07 Fev 2016 23:00

Pessoal e professores boa noite!
Pra não abrir outro tópico desnecessariamente, posto aqui minha dúvida:
Tenho usado o seguinte código para renomear o meu "arquivo.dbf" para "arquivo.dbf2" (nome fictício só para efeito didático).
No momento da renomeação, tudo ocorre perfeitamente.
Agora, crio um novo arquivo (sem nenhum campo) e através de uma matriz que pegou todos os nomes dos campos do "arquivo.dbf" (antes de renomear) e para voltar os dados novamente para o novo "arquivo.dbf" uso o APPEND FROM.
Vejam, como essas linhas funcionam:
(...)
            &ARQUIVO.->(dbclosearea())
            if frename(NOME_EXTERNO, NOME_EXTERNO+"2") = 0
               dbcreate(NOME_EXTERNO, a_stru)
               use (NOME_EXTERNO) exclusive new
               // append from &NOME_EXTERNO.+"2"
               // append from "&NOME_EXTERNO."+"2"
               append from C:\SISTEMA\CADCLI.DBF2
               use
               // ferase(&NOME_EXTERNO.+"2")
            else
               wait 'não alterou o nome do arquivo'
               return
            endif
(...)

Observerm que comentei 3 linhas: 2 com o APPEND FROM e uma com o ERASE. Quero falar sobre as linhas do APPEND FROM.

Bom, não postei o código, mas, explico o conteúdo (básico) das 2 matrizes que aqui chamo de ARQUIVO e NOME_EXTERNO.
ARQUIVO = "CADCLI" (uso para identificar apenas o alias())
NOME_EXTERNO = "C:\SISTEMA\CADCLI.DBF" (aqui é o caminho e nome completo do arquivo)
Então - prezados professores, como estou usando & (macro substituição) para renomear o arquivo (NOME_EXTERNO) para NOME_EXTERNO2 (e funciona corretamente).
Como faço para que o APPEND FROM (linhas comentadas) usem a macrosubstituição?
Por que a minha pergunta, se eu posso muito bem colocar o nome como fiz?

É muito simples, essas 2 matrizes (ARQUIVO e NOME_EXTERNO) são passadas por referência e quero usar essa função ALTERA_ARQUIVO() em todos os módulos.

Alguém pode testar o código e me dar uma solução?
grato!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1175
Data de registro: 02 Set 2011 22:17
Curtiu: 59 vezes
Mens.Curtidas: 17 vezes

Append from (arqtxt) sdf

Mensagempor Jairo Maia » 08 Fev 2016 12:45

Olá Microvolution,

Ao invés de:
append from "&NOME_EXTERNO."+"2"

Tente usar:
append from (NOME_EXTERNO)+"2"
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 de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Append from (arqtxt) sdf

Mensagempor microvolution » 09 Fev 2016 08:48

parabéns prezado professor.
ficou top d+
gracias!
Grato,
MICROVOLUTION - 16 anos Evoluindo Com Você!


Você já leu a Bíblia hoje?
João 3:16 - Porque Deus amou ao mundo de tal maneira que deu seu Único Filho para que todo aquele que nEle crê não pereça mas tenha a Vida Eterna!
microvolution
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1175
Data de registro: 02 Set 2011 22:17
Curtiu: 59 vezes
Mens.Curtidas: 17 vezes

Append from (arqtxt) sdf

Mensagempor wesley assis » 02 Ago 2017 16:16

Estrutura com decimais.jpg

Meus Caros, boa tarde!

Desculpe-me a ignorância, mas seguindo os exemplos acima do Alexandre e corrigido pelo do Pablo César, tanto no Clipper como no HMG, compilei e executei e deu tudo certinho. Mas verificando no FOX a estrutura desse arquivo ficou como REG Character Width 112 Dec 23.
O programa pediu para criar um campo Caracter com 6000, como mostra abaixo:

aadd(aCampos,{"reg" ,"C", 6000, 0})
DBCREATE("strut",aCampos)

Pergunta: Quando vou criar um campo tipo "C", sempre é sem decimais. Outra coisa, quando abro esse arquivo no FOX ou EXCEL, mostra-me apenas as 112 caracteres iniciais, apesar que pedi o programa para consultar uma palavra lá no meio com AT(), ele estava lá.
Tem algum Editor de DBF que mostra as 6000 linhas?

Att,

Wesley Assis
wesley assis
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 37
Data de registro: 08 Abr 2010 16:16
Cidade/Estado: Belo Horizonte - MG
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

Append from (arqtxt) sdf

Mensagempor JoséQuintas » 03 Ago 2017 16:41

Talvez um editor criado em Harbour mesmo.

O DBF é padrão, mas tem certas diferenças entre linguagens de programação.
Alguns tipos aceitos em uma linguagem não são necessariamente aceitos em outras.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro