2013-03-29 12 views
5

Ho avuto una domanda sul comando COPY in PostgreSQL. Ho un file CSV che voglio solo copiare alcuni valori delle colonne nella mia tabella PostgreSQL.Comando COPY: copia solo colonne specifiche da csv

È possibile farlo? Conosco il comando COPY per copiare tutti i dati da un CSV in una tabella usando l'intestazione per mappare i nomi delle colonne, ma come è possibile quando voglio solo alcune delle colonne?

risposta

7

In entrambi i pre-processo di file CSV, o importare (quello che probabilmente farei) in una copia temporanea della tabella di destinazione e INSERT solo le colonne selezionate in un secondo momento:

CREATE TEMP TABLE tmp AS SELECT * FROM target_table LIMIT 0; 
ALTER TABLE tmp ADD COLUMN etra_column1 text 
      , ADD COLUMN etra_column2 text; -- add excess columns 
COPY tmp FROM '/path/tp/file.csv'; 

INSERT INTO target_table (col1, col2, col3) 
SELECT col1, col2, col3 FROM tmp -- only reelvant columns 
WHERE ... -- optional, to also filter rows 

una tabella temporanea è lasciato automaticamente alla fine della sessione. Se l'elaborazione richiede più tempo, utilizzare una tabella normale.

+0

Ok, fantastico, questa è un'ottima informazione. Stavo pensando di pre-elaborare il file CSV ma la tabella temporanea sembra che sarà molto più facile. Grazie! – parchambeau

+0

Qualche consiglio se la tabella è * enorme * - dimensioni gigabyte? – Chloe

+0

@Chloe: Dipende molto dai dettagli e dalle vostre esigenze. La tua versione di Postgres, la dimensione della tabella e il file CSV, la larghezza della riga, il numero di colonne in eccesso, le risorse disponibili, i privilegi di superutente, l'accesso simultaneo, i dati in CSV sono coerenti? Ecc. Suggerisco di iniziare una nuova domanda con le specifiche. grazie per la modifica, BTW, ero davvero concentrato sulla selezione delle file anziché delle colonne. –

Problemi correlati