diff --git a/src/impulsoetl/siasus/bpa_i.py b/src/impulsoetl/siasus/bpa_i.py index 37ea1d9..6788a17 100644 --- a/src/impulsoetl/siasus/bpa_i.py +++ b/src/impulsoetl/siasus/bpa_i.py @@ -18,6 +18,7 @@ from prefect import flow, task from sqlalchemy.orm import Session from uuid6 import uuid7 +import re from impulsoetl import __VERSION__ from impulsoetl.comum.datas import ( @@ -156,13 +157,25 @@ def extrair_bpa_i( [`datetime.date`]: https://docs.python.org/3/library/datetime.html#date-objects """ + # yield from extrair_dbc_lotes( + # ftp="ftp.datasus.gov.br", + # caminho_diretorio="/dissemin/publicos/SIASUS/200801_/Dados", + # arquivo_nome="BI{uf_sigla}{periodo_data_inicio:%y%m}.dbc".format( + # uf_sigla=uf_sigla, + # periodo_data_inicio=periodo_data_inicio, + # ), + # passo=passo, + # ) + + arquivo_padrao = "BI{uf_sigla}{periodo_data_inicio:%y%m}(?:_\d+)?.dbc".format( + uf_sigla=uf_sigla, + periodo_data_inicio=periodo_data_inicio, + ) + yield from extrair_dbc_lotes( ftp="ftp.datasus.gov.br", caminho_diretorio="/dissemin/publicos/SIASUS/200801_/Dados", - arquivo_nome="BI{uf_sigla}{periodo_data_inicio:%y%m}.dbc".format( - uf_sigla=uf_sigla, - periodo_data_inicio=periodo_data_inicio, - ), + arquivo_nome=re.compile(arquivo_padrao, re.IGNORECASE), passo=passo, ) diff --git a/src/impulsoetl/utilitarios/datasus_ftp.py b/src/impulsoetl/utilitarios/datasus_ftp.py index 91f5b69..b453826 100644 --- a/src/impulsoetl/utilitarios/datasus_ftp.py +++ b/src/impulsoetl/utilitarios/datasus_ftp.py @@ -115,11 +115,21 @@ def _listar_arquivos( if arquivo == arquivo_nome_ou_padrao ] + # Checar por arquivos particionados e não particionados em BPA + unpartitioned_files = [ + arquivo for arquivo in arquivos_compativeis if not re.search(r"_\d+\.dbc$", arquivo) + ] + partitioned_files = [ + arquivo for arquivo in arquivos_compativeis if re.search(r"_\d+\.dbc$", arquivo) + ] + if unpartitioned_files and partitioned_files: + # Ignorar arquivos não particionados se existirem + arquivos_compativeis = partitioned_files + arquivos_compativeis_num = len(arquivos_compativeis) if arquivos_compativeis_num > 0: logger.info( - "Encontrados {numero_arquivos} arquivos.", - numero_arquivos=arquivos_compativeis_num, + f"Encontrados {arquivos_compativeis_num} arquivos." ) return arquivos_compativeis else: @@ -130,6 +140,7 @@ def _listar_arquivos( raise error_perm + def extrair_dbc_lotes( ftp: str, caminho_diretorio: str,