Recebo diariamente um csv de uma empresa externa capturando feedback para nós.
Inutilmente, os títulos csv variam. Pode haver qualquer combinação de cabeçalhos. Por exemplo:
dia1: rubrica1, rubrica2, rubrica3, rubrica4, rubrica5
dia 2: rubrica 1, rubrica 2, rubrica 4, rubrica 6
dia 3: rubrica 1, rubrica 2, rubrica 7, rubrica 8
dia 4: rubrica 1, rubrica 2, rubrica 3, rubrica 4, rubrica 5
Temos 18 meses (ninguém fez nada com esses dados até agora) de arquivos de backlog e até agora encontrei 22 combinações diferentes...
Eu sei quais serão todos os títulos em potencial para que eu possa ter uma tabela SQL que contenha todas as colunas apropriadas, mas estou lutando para lidar com a variação para importação.
Existe uma maneira de lidar com isso no SSIS? Eu olhei para bcp e openrowset, mas não consigo fazê-lo funcionar.
Como esse arquivo é recebido diariamente, quero um trabalho sql que os importe para minha tabela para relatórios. Só posso criar um pacote SSIS que importará um arquivo simples fixo, mas preciso que seja dinâmico. O pior cenário seria ter mais de 22 pacotes SSIS diferentes e executar um 1 específico para os títulos fornecidos, mas precisaria de uma maneira de ler automaticamente a estrutura do csv para decidir qual pacote usar.
Estou perdido, então alguém tem alguma direção?
SQL 2016 (13.0.5622.0)
Muito Obrigado
Eu faria assim:
Existe alguma tabela de trabalho onde os dados devem ser colocados. Ele contém colunas para todos os dados que podem estar presentes em CSVs, com nomes próprios e tipos de dados.
Crie uma tabela de nomes com 2 colunas: nome da coluna usada no CSV; de acordo com o nome da coluna na tabela de trabalho. Curti
Cada coluna é definida como única.
Carrega a primeira linha do arquivo CSV (o arquivo é renomeado para algum nome pré-definido ou é obtido como um parâmetro), analisa-o para separar nomes, depois os adiciona em CSV_name ignorando erros duplicados e conta a quantidade de nomes na tabela de nomes com NULL em table_name.
Se houver linhas CSV_name com table_name IS NULL, o procedimento digitará uma mensagem e interromperá. O operador procura a tabela de nomes e preenche a coluna table_name com os valores correspondentes e, em seguida, chama o procedimento novamente.
Se todos os CSV_names tiverem de acordo com o table_name, o procedimento criará uma tabela temporária e carregará todos os dados nela. Após o carregamento dos dados, o procedimento cria o texto da consulta INSERT INTO e copia os dados na tabela de trabalho. Alternativamente, o texto de consulta de importação correto pode ser criado/executado em uma etapa.
Considere um cenário simplificado com dois arquivos diferentes, cada um contendo diferentes subconjuntos de dados.
abc.csv:
abd.csv:
Agora, podemos usar o PowerShell para importar o arquivo, as
Select
colunas para um número e ordem conhecidos e consistentes e exportá-lo de volta para um csv com arquivos previsíveis:Isso produzirá dois novos arquivos que têm um formato de arquivo comum e previsível.
abc_cleansed.csv:
abd_cleansed.csv:
Nota: Eu omiti aspas duplas em meus arquivos csv iniciais, e o PowerShell também os adicionou de maneira útil. Você pode removê-los, mas IMHO esse é definitivamente um recurso benéfico para a qualidade dos dados.
Agora, você pode simplesmente construir um pipeline de dados onde você pega um arquivo de entrada, faz a conversão para limpar o formato e, em seguida, pega esses arquivos limpos para importá-los. Dependendo do seu processo, você pode fazer tudo isso em um único pacote SSIS ou criar processos separados de limpeza/importação de dados.
Boa noite amigo. Você já ouviu as boas notícias sobre DBATools?
Import-DbaCsv
pode ser a função para você. Eu escrevi um patch um tempo atrás que detecta automaticamente e mapeia os nomes das colunas com base na origem e destino sob certas restrições. Pode ser exatamente o que você precisa.