2013-03-29 6 views
5

Ich hatte eine Frage um den COPY Befehl in PostgreSQL. Ich habe eine CSV-Datei, die ich nur einige Spaltenwerte in meine PostgreSQL-Tabelle kopieren möchte.COPY-Befehl: Kopieren Sie nur bestimmte Spalten von CSV

Ist es möglich, dies zu tun? Ich bin vertraut mit dem Befehl COPY, um alle Daten aus einer CSV in eine Tabelle zu kopieren, die Header zu den Spaltennamen zuordnen, aber wie ist das möglich, wenn ich nur einige der Spalten möchte?

Antwort

7

Entweder Vorprozess die CSV-Datei oder importieren (was ich wohl tun würde) in eine temporäre Kopie der Zieltabelle und INSERT nur ausgewählte Spalten in einem zweiten Schritt:

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 

Eine temporäre Tabelle ist wird automatisch am Ende der Sitzung gelöscht. Wenn die Verarbeitung länger dauert, verwenden Sie eine normale Tabelle.

+0

Okay, super, das ist eine tolle Info. Ich dachte an die Vorverarbeitung der CSV-Datei, aber die Temp-Tabelle scheint viel einfacher zu sein. Vielen Dank! – parchambeau

+0

Irgendwelche Tipps, wenn die Tabelle * riesig * - Gigabyte groß ist? – Chloe

+0

@Chloe: Es hängt sehr von den Details und Ihren Anforderungen ab. Ihre Version von Postgres, Größe der Tabelle und CSV-Datei, Breite der Zeile, wie viele überschüssige Spalten, verfügbare Ressourcen, Superuser-Berechtigungen, gleichzeitiger Zugriff, Daten in CSV konsistent? Etc. Ich schlage vor, Sie beginnen eine neue Frage mit den Besonderheiten. Danke für die Bearbeitung, BTW, ich war in der Tat auf die Auswahl von Zeilen statt Spalten konzentriert. –