Ler arquivo da prefeitura SP

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

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

Ler arquivo da prefeitura SP

Mensagem por JoséQuintas »

Fiz isso para um possível uso e acabei não usando.
Fica aí pra quem precisar.
Só colocar nome de variável nas colunas que for usar.

Código: Selecionar todos


// Leitura do Layout 1

#include "inkey.ch"

PROCEDURE PTESPREF

   LeRetornoPrefeitura( "nfse_1.csv" )
   RETURN


FUNCTION LeRetornoPrefeitura( cFile )

   LOCAL mNFTipo, mNFNumero, mNFDataHora
   LOCAL mNFDatCan, mNFValorServicos, mNFValorDeducoes
   LOCAL mNFAliquota, mNFISSDevido, mNFISSCredito, mNFISSRetido
   LOCAL mTomCnpj, mTomNome, mTomEndTipo, mTomEndLogradouro
   LOCAL mTomEndNumero, mTomEndComplemento, mTomEndBairro, mTomEndCidade, mTomEndUF, mTomEndCep, mDescServico
   LOCAL oFile, cTxt

   oFile := TFileRead():New( cFile )
   oFile:Open()
   DO WHILE oFile:MoreToRead()
      cTxt := oFile:ReadLine()
      mNFTipo            := PegaBloco( @cTxt, ";" ) // Tipo de Registro 2
      mNFNumero          := PegaBloco( @cTxt, ";" ) // Nº NFS-e 385
      mNFDataHora        := PegaBloco( @cTxt, ";" ) // Data Hora NFE 08/05/2015 12:29:37
                            PegaBloco( @cTxt, ";" ) // Código de Verificação da NFS-e G4E84SXK
                            PegaBloco( @cTxt, ";" ) // Tipo de RPS RPS
                            PegaBloco( @cTxt, ";" ) // Série do RPS A
                            PegaBloco( @cTxt, ";" ) // Número do RPS 385
                            PegaBloco( @cTxt, ";" ) // Data de Emissão do RPS 08/05/2015
                            PegaBloco( @cTxt, ";" ) // Inscrição Municipal do Prestador (com formatação)
                            PegaBloco( @cTxt, ";" ) // Indicador de CPF/CNPJ do Prestador 2
                            PegaBloco( @cTxt, ";" ) // CPF/CNPJ do Prestador (com formatação)
                            PegaBloco( @cTxt, ";" ) // Razão Social do Prestador
                            PegaBloco( @cTxt, ";" ) // Tipo do Endereço do Prestador (R, AV, etc)
                            PegaBloco( @cTxt, ";" ) // Endereço do Prestador
                            PegaBloco( @cTxt, ";" ) // Número do Endereço do Prestador (com zeros)
                            PegaBloco( @cTxt, ";" ) // Complemento do Endereço do Prestador
                            PegaBloco( @cTxt, ";" ) // Bairro do Prestador
                            PegaBloco( @cTxt, ";" ) // Cidade do Prestador
                            PegaBloco( @cTxt, ";" ) // UF do Prestador
                            PegaBloco( @cTxt, ";" ) // CEP do Prestador (00000-000)
                            PegaBloco( @cTxt, ";" ) // Email do Prestador
                            PegaBloco( @cTxt, ";" ) // Situação da Nota Fiscal Opção Pelo Simples 4
                            PegaBloco( @cTxt, ";" ) // Opção pelo Simples
      mNFDatCan          := PegaBloco( @cTxt, ";" ) // Data de Cancelamento T
                            PegaBloco( @cTxt, ";" ) // Nº da Guia
                            PegaBloco( @cTxt, ";" ) // Data de Quitação da Guia Vinculada a Nota Fiscal
      mNFValorServicos   := PegaBloco( @cTxt, ";" ) // Valor dos Serviços (0.000,00)
      mNFValorDeducoes   := PegaBloco( @cTxt, ";" ) // Valor das Deduções (0,00)
                            PegaBloco( @cTxt, ";" ) // Código do Serviço Prestado na Nota Fiscal 2682
      mNFAliquota        := PegaBloco( @cTxt, ";" ) // Alíquota (0,00)
      mNFISSDevido       := PegaBloco( @cTxt, ";" ) // ISS devido (0,00)
      mNFISSCredito      := PegaBloco( @cTxt, ";" ) // Valor do Crédito (0,00)
      mNFISSRetido       := PegaBloco( @cTxt, ";" ) // ISS Retido N
                            PegaBloco( @cTxt, ";" ) // Indicador de CPF/CNPJ do Tomador 2
      mTomCnpj           := PegaBloco( @cTxt, ";" ) // CPF/CNPJ do Tomador (com formatação)
                            PegaBloco( @cTxt, ";" ) // Inscrição Municipal do Tomador (com formatação)
                            PegaBloco( @cTxt, ";" ) // Inscrição Estadual do Tomador
      mTomNome           := PegaBloco( @cTxt, ";" ) // Razão Social do Tomador
      mTomEndTipo        := PegaBloco( @cTxt, ";" ) // Tipo do Endereço do Tomador (R, AV, etc)
      mTomEndLogradouro  := PegaBloco( @cTxt, ";" ) // Endereço do Tomador
      mTomEndNumero      := PegaBloco( @cTxt, ";" ) // Número do Endereço do Tomador (com zeros)
      mTomEndComplemento := PegaBloco( @cTxt, ";" ) // Complemento do Endereço do Tomador
      mTomEndBairro      := PegaBloco( @cTxt, ";" ) // Bairro do Tomador
      mTomEndCidade      := PegaBloco( @cTxt, ";" ) // Cidade do Tomador
      mTomEndUF          := PegaBloco( @cTxt, ";" ) // UF do Tomador
      mTomEndCep         := PegaBloco( @cTxt, ";" ) // CEP do Tomador (00000-000)
                            PegaBloco( @cTxt, ";" ) // Email do Tomador
      mDescServico       := PegaBloco( @cTxt, ";" ) // Discriminação dos Serviços

      // Vamos ao que interessa
      IF mNFTipo != "2"
         LOOP
      ENDIF

      Cls()
      @ 0, 0 SAY ""
      @ Row() + 1, 0 SAY "Nota:" + mNFNumero
      @ Row() + 1, 0 SAY "Emissão:" + mNFDataHora
      @ Row() + 1, 0 SAY "Cancelamento:" + mNFDatCan
      @ Row() + 1, 0 SAY "CNPJ:" + mTomCnpj
      @ Row() + 1, 0 SAY "Nome:" + mTomNome
      @ Row() + 1, 0 SAY "Endereço:" + mTomEndTipo + " " + mTomEndLogradouro + " " + mTomEndNumero + " " + mTomEndComplemento
      @ Row() + 1, 0 SAY "Bairro:" + mTomEndBairro
      @ Row() + 1, 0 SAY "Cidade:" + mTomEndCidade
      @ Row() + 1, 0 SAY "UF:" + mTomEndUF
      @ Row() + 1, 0 SAY "CEP:" + mTomEndCep
      @ Row() + 1, 0 SAY "Valor:" + mNFValorServicos
      @ Row() + 1, 0 SAY "Deduções:" + mNFValorDeducoes
      @ Row() + 1, 0 SAY "Alíquota:" + mNFAliquota
      @ Row() + 1, 0 SAY "ISS Devido:" + mNFISSDevido
      @ Row() + 1, 0 SAY "ISS Crédito:" + mNFISSCredito
      @ Row() + 1, 0 SAY "ISS Retido:" + mNFISSRetido
      @ Row() + 1, 0 SAY "DescServico:" + mDescServico
      Mensagem( "<ESC> abandona, outra tecla continua" )
      IF Inkey(0) == K_ESC
         EXIT
      ENDIF
   ENDDO
   oFile:Close()
   RETURN NIL


STATIC FUNCTION PegaBloco( cTxt, cSeparador )

   LOCAL cBloco

   cBloco := Substr( cTxt, 1, At( cSeparador, cTxt + cSeparador ) - 1 )
   cTxt   := Substr( cTxt, At( cSeparador, cTxt + cSeparador ) + 1 )
   RETURN cBloco
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/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Ler arquivo da prefeitura SP

Mensagem por gilbertosilverio »

Ola Jose,

Aproveitando esta rotina, e possível, desprezar algum separador que esta dentro de uma linha sepadara por virgula:

Para ficar mais claro...

Tenho os campos em um arquivo CSV desta maneira:

nome, endereco, bairro, cep
Gilberto,Rua sobe e desce,100,Centro,1234567


O que ocorre:
Por ter a vírgula separando o endereço do numero, a importação e feita de forma errada.

Sei que trocando o separador de virgula pra ponto e virgula, resolve, mais as vezes nos são enviados arquivos com este formato, sera que e possivel ou existe alguma função pra coibir isso.

Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ler arquivo da prefeitura SP

Mensagem por JoséQuintas »

Se só o endereço tem essa possibilidade, talvez testar a quantidade de parâmetros, ou tirar os demais e o que sobrar considerar endereço.
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

Ler arquivo da prefeitura SP

Mensagem por JoséQuintas »

Esta aí, se são poucos campos pra se aproveitar, melhor seria um array mesmo.
Uma idéia:

Código: Selecionar todos

PROCEDURE Main

   LOCAL cTexto, aParametros, nExtra, cNome, cEndereco, cCidade, cUF

   Inkey(0)
   cTexto := "jose,rua um, 2, casa 3, sao paulo, sp"

   aParametros := hb_regexSplit( ",", cTexto )
   nExtra := iif( Len( aParametros ) > 4, Len( aParametros ) - 4, 0 )
   cNome := aParametros[ 1 ]
   cEndereco := aParametros[ 2 ]
   IF nExtra > 0
      FOR nCont = 1 TO nExtra
         cEndereco += " " + aParametros[ 2 + nCont ]
      NEXT
   ENDIF
   cCidade := aParametros[ 3 + nExtra ]
   cUF := aParametros[ 4 + nExtra ]

   ? "nome " + cNome
   ? "endereco " + cEndereco
   ? "cidade " + cCidade
   ? "UF " + cUF

   RETURN

Código: Selecionar todos

d:\temp>test

nome jose
endereco rua um  2  casa 3
cidade  sao paulo
UF  sp
Nota: Post editado pra corrigir fonte.
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

Ler arquivo da prefeitura SP

Mensagem por JoséQuintas »

A rotina é relativamente simples, mas pode ter novidade, então a explicação:

Divide a linha, considerando como separador ","

Código: Selecionar todos

   aParametros := hb_regexSplit( ",", cTexto )
São 4 parametros, então o que tem a mais é considerado extra

Código: Selecionar todos

   nExtra := iif( Len( aParametros ) > 4, Len( aParametros ) - 4, 0 )
Até o endereço, é normal

Código: Selecionar todos

   cNome := aParametros[ 1 ]
   cEndereco := aParametros[ 2 ]
Se tem coluna extra, faz parte do endereço

Código: Selecionar todos

   IF nExtra > 0
      FOR nCont = 1 TO nExtra
         cEndereco += " " + aParametros[ 2 + nCont ]
      NEXT
   ENDIF
e a partir do endereço, só ajustar + nExtra, assim compensa se existirem posições extras

Código: Selecionar todos

   cCidade := aParametros[ 3 + nExtra ]
   cUF := aParametros[ 4 + nExtra ]
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/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Ler arquivo da prefeitura SP

Mensagem por gilbertosilverio »

Jose,

Veja como ficou... vivendo e aprendendo...

Código: Selecionar todos

function teste_csv()
   LOCAL cNOME, cENDERECO, cCIDADE, cCEP

   cTEXTO:=[GILBERTO,RUA SOBE E, DESCE,100,CENTRO,12345678]

   aParametros := hb_regexSplit( "," , cTexto )

   ALERT(STR(Len(aParametros)))

   AEval( aParametros, {|c| QOut(c) } )

   wait

   nExtra := iif( Len( aParametros ) > 4,  Len(aParametros)-4, 0 )

   ALERT( STR(nEXTRA) )

   cNome       := aParametros[ 1 ]
   cEndereco   := aParametros[ 2 ]
   IF nExtra > 0
      FOR nCont = 1 TO nExtra
          cEndereco += " " + aParametros[ 2 + nCont ]
      NEXT
   ENDIF
   cCidade := aParametros[ 3 + nEXTRA]
   cCEP    := aParametros[ 4 + nEXTRA]

   ? cNOME
   ? cENDERECO
   ? cCIDADE
   ? cCEP
   WAIT
return nil
Nao conhecia a hb_regexSplit, so tive que mudar os parametros que voce passou, parece que vai funcionar, vou testar qualquer coisa posto aqui.

Muito obrigado.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ler arquivo da prefeitura SP

Mensagem por JoséQuintas »

Só faltou uma coisa, pra precaução:

Código: Selecionar todos

IF Len( aParametros ) < 4
   ? "Linha sem a quantidade necessária de elementos"
ENDIF
Note que editei depois de fazer o teste prático, não sei se chegou a ver editado.
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/
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Ler arquivo da prefeitura SP

Mensagem por gilbertosilverio »

Ola Jose,

Quando fui testar a tua rotina, percebi a troca de parâmetros consultando o hb_regexSplit, para ver o que ele fazia.

Na mesma hora que voce postou as correções, também postei o que tinha feito.

Agradeço a tua dica, e agora vou melhorar a minha rotina para importar o arquivo.csv, uso isso pra fazer a importação de pedidos dos sites de e-comerce, e cada um te seu padrão, ou melhor, nenhum padrão... rsrsrs
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ler arquivo da prefeitura SP

Mensagem por JoséQuintas »

Se é que já não pensou nisto:
Se houver alguma padronização no restante, poderia criar uma base de configurações.
Algo como um cadastro por site, indicando qual a posição de cada informação.
E ai a rotina anterior se tornaria genérica, apesar que voltaria ao problema do endereço com vírgulas... rs

Código: Selecionar todos

Array := LeituraCsv()
SEEK "site x"
cPedido := Array[ arquivo->PosicaoNumeroPedido ]
cProduto := Array[ arquivo->PosicaoProduto ]
nQtde := Array[ arquivo->PosicaoQtd ]
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