PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

COPIAR apenas algumas colunas de um CSV de entrada?


Não sei onde você conseguiu essa sintaxe, mas COPY não leva uma lista de aliases de coluna como essa. Veja a ajuda:
COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

(AS não é uma das opções listadas; para ver a saída completa, execute \d copy no psql, ou veja o manual para a copy comando on-line).

Não há recurso de mapeamento em COPY que permite ler apenas algumas colunas do CSV de entrada. Seria muito útil, mas ninguém teve tempo/interesse/financiamento para implementá-lo ainda. É realmente apenas uma das muitas tarefas de transformação/filtragem de dados que as pessoas desejam de qualquer maneira.

O PostgreSQL espera a lista de colunas fornecida em COPY estar na mesma ordem, da esquerda para a direita, do que está no arquivo CSV e ter o mesmo número de entradas que o arquivo CSV tem colunas. Então, se você escrever:
COPY con (date,kgs)

então o PostgreSQL esperará um CSV de entrada com exatamente duas colunas . Ele usará a primeira coluna csv para o "date" coluna da tabela e a segunda coluna csv para o "kgs" coluna da tabela. Não importa quais são os cabeçalhos CSV, eles serão ignorados se você especificar WITH (FORMAT CSV, HEADER ON) , ou tratadas como linhas de dados normais se você não especificar HEADER .

PostgreSQL 9.4 adiciona FROM PROGRAM para COPY , para que você possa executar um comando shell para ler o arquivo e filtrá-lo. Um simples script Python ou Perl faria o trabalho.

Se for um arquivo pequeno, basta abrir uma cópia na planilha de sua escolha como um arquivo csv, excluir as colunas indesejadas e salvá-lo, então apenas a date e kgs colunas permanecem.

Como alternativa, COPY para uma tabela de preparo que tenha todas as mesmas colunas que o CSV , então faça um INSERT INTO ... SELECT para transferir apenas os dados desejados para a tabela de destino real.