Qual é a melhor solução de análise de arquivos para converter arquivos?
-
18-09-2019 - |
Pergunta
Estou procurando a melhor solução para análise de arquivos personalizados para nossas rotinas de importação corporativa. Quero alterar basicamente um formato de arquivo em um formato de arquivo padrão e ter uma rotina que importa esses dados no banco de dados. Preciso criar scripts personalizados para cada cliente, pois é difícil fazer com que o cliente cumpra um formato padrão ou de modelo. Eu olhei para PowerShell e Iron Python para fazer isso até agora, mas não tenho certeza se esse é o caminho que quero seguir. Também analisei algumas ferramentas, como o Talend, que é uma ferramenta de estilo de arrastar e soltar que pode ou não me dar o que eu quero até a flexibilidade. Somos uma loja .NET e criamos código personalizado para fazer isso no passado, mas preciso de algo mais rápido para criar e codificar funções de análise personalizadas cada vez que obtemos um novo formato de arquivo.
Solução
Python é maravilhoso para esse tipo de coisa. É por isso que usamos. Cada nova transferência de clientes é uma nova aventura e o Python nos dá a flexibilidade de responder rapidamente.
Editar. Todos os scripts do Python que lêem os arquivos são "analisadores de arquivos personalizados". Sem um exemplo real, não é sensato fornecer um exemplo detalhado.
with open( "some file", "r" ) as source:
for line in source:
process( line )
É tudo o que existe para um "analisador de arquivo personalizado". Se você estiver analisando os arquivos .csv ou .xml, o Python possui módulos para isso. Se você estiver analisando arquivos de formato fixo, usaria operações de fatiamento de string. Se você estiver analisando outros arquivos (x12? Json? Yaml?) Você precisará de analisadores apropriados.
Tab-delim.
from collections import namedtuple
RecordLayout = namedtuple('RecordLayout',['field1','field2','field3',...])
def process( aLine ):
record = RecordLayout( aLine.split('\t') )
...
Layout fixo.
from collections import namedtuple
RecordLayout = namedtuple('RecordLayout',['field1','field2','field3',...])
def process( aLine ):
fields = ( aLine[:10], aLine[10:20], aLine[20:30], ... )
record = RecordLayout( fields )
...
Outras dicas
Dependendo da complexidade e variabilidade do seu trabalho, considere uma ferramenta ETL como o SSIS (SQL Server Integration Services).