Página 1 de 1

Ler arquivo da prefeitura SP

Enviado: 09 Ago 2015 20:09
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

Ler arquivo da prefeitura SP

Enviado: 08 Out 2016 15:39
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.

Ler arquivo da prefeitura SP

Enviado: 08 Out 2016 17:33
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.

Ler arquivo da prefeitura SP

Enviado: 08 Out 2016 17:53
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.

Ler arquivo da prefeitura SP

Enviado: 08 Out 2016 18:21
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 ]

Ler arquivo da prefeitura SP

Enviado: 08 Out 2016 18:43
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.

Ler arquivo da prefeitura SP

Enviado: 08 Out 2016 19:15
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.

Ler arquivo da prefeitura SP

Enviado: 09 Out 2016 08:11
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

Ler arquivo da prefeitura SP

Enviado: 09 Out 2016 10:54
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 ]