AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 276255
Accepted
Round
Round
Asked: 2020-09-30 03:25:53 +0800 CST2020-09-30 03:25:53 +0800 CST 2020-09-30 03:25:53 +0800 CST

Importar csv diário com vários cabeçalhos disponíveis

  • 772

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

sql-server sql-server-2016
  • 3 3 respostas
  • 216 Views

3 respostas

  • Voted
  1. Akina
    2020-09-30T04:38:50+08:002020-09-30T04:38:50+08:00

    Eu faria assim:

    1. 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.

    2. 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

    CSV_name    | table_name
    ------------|-----------
    ID          | id
    user_id     | id
    Employee_id | id
    name        | first_name
    FirstName   | first_name
    ...         | ...
    

    Cada coluna é definida como única.

    1. Crie um procedimento que:
    • 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.

    • 2
  2. Best Answer
    AMtwo
    2020-09-30T07:49:16+08:002020-09-30T07:49:16+08:00

    Considere um cenário simplificado com dois arquivos diferentes, cada um contendo diferentes subconjuntos de dados.

    abc.csv:

    a,b,c
    1,a,a
    2,b,b
    3,c,c
    4,d,d
    

    abd.csv:

    a,b,d
    1,a,1
    4,d,4
    5,e,5
    6,f,6
    

    Agora, podemos usar o PowerShell para importar o arquivo, as Selectcolunas para um número e ordem conhecidos e consistentes e exportá-lo de volta para um csv com arquivos previsíveis:

    Import-Csv abc.csv | Select a,b,c,d,e,f,g | Export-Csv abc_cleansed.csv -NoTypeInformation
    Import-Csv abd.csv | Select a,b,c,d,e,f,g | Export-Csv abd_cleansed.csv -NoTypeInformation
    

    Isso produzirá dois novos arquivos que têm um formato de arquivo comum e previsível.

    abc_cleansed.csv:

    "a","b","c","d","e","f","g"
    "1","a","a",,,,
    "2","b","b",,,,
    "3","c","c",,,,
    "4","d","d",,,,
    

    abd_cleansed.csv:

    "a","b","c","d","e","f","g"
    "1","a",,"1",,,
    "4","d",,"4",,,
    "5","e",,"5",,,
    "6","f",,"6",,,
    

    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.

    • 2
  3. Peter Vandivier
    2020-09-30T05:50:10+08:002020-09-30T05:50:10+08:00

    Boa noite amigo. Você já ouviu as boas notícias sobre DBATools?

    mórmons como dbatools

    Import-DbaCsvpode 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.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve