PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

COPIARE solo alcune colonne da un CSV di input?

Non so dove hai preso quella sintassi, ma COPY non accetta un elenco di alias di colonna del genere. Vedi l'aiuto:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]

(AS non è una delle opzioni elencate; per vedere l'output completo, esegui \d copy in psql, oppure guarda il manuale per la copy comando in linea).

Non è presente alcuna funzione di mappatura in COPY che consente di leggere solo alcune colonne del CSV di input. Sarebbe davvero utile, ma nessuno ha ancora avuto il tempo/l'interesse/il finanziamento per implementarlo. In realtà è solo una delle tante attività di trasformazione/filtraggio dei dati che le persone desiderano comunque.

PostgreSQL si aspetta l'elenco di colonne fornito in COPY essere nello stesso ordine, da sinistra a destra, del file CSV e avere lo stesso numero di voci delle colonne del file CSV. Quindi se scrivi:

COPY con (date,kgs)

quindi PostgreSQL si aspetterà un CSV di input con esattamente due colonne . Utilizzerà la prima colonna CSV per il "date" colonna della tabella e la seconda colonna CSV per il "kgs" colonna della tabella. Non importa quali siano le intestazioni CSV, vengono ignorate se specifichi WITH (FORMAT CSV, HEADER ON) o trattate come normali righe di dati se non specifichi HEADER .

PostgreSQL 9.4 aggiunge FROM PROGRAM a COPY , quindi potresti eseguire un comando di shell per leggere il file e filtrarlo. Un semplice script Python o Perl farebbe il lavoro.

Se si tratta di un file di piccole dimensioni, apri una copia nel foglio di lavoro di tua scelta come file CSV, elimina le colonne indesiderate e salvalo, quindi solo la date e kgs le colonne rimangono.

In alternativa, COPY in una tabella di staging che ha tutte le stesse colonne del CSV , quindi esegui un INSERT INTO ... SELECT per trasferire solo i dati desiderati nella tabella di destinazione reale.