PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Nur einige Spalten aus einer Eingabe-CSV KOPIEREN?

Ich weiß nicht, woher Sie diese Syntax haben, aber COPY nimmt keine solche Liste von Spaltenaliasen. Siehe Hilfe:

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

(AS ist keine der aufgelisteten Optionen; Um die vollständige Ausgabe anzuzeigen, führen Sie \d copy aus in psql, oder schauen Sie im Handbuch nach copy Befehl online).

Es gibt keine Zuordnungsfunktion in COPY Dadurch können Sie nur einige Spalten der Eingabe-CSV lesen. Es wäre wirklich nützlich, aber niemand hatte bisher die Zeit/das Interesse/die Finanzierung, es umzusetzen. Es ist wirklich nur eine von vielen Datenumwandlungs-/Filteraufgaben, die die Leute sowieso wollen.

PostgreSQL erwartet die in COPY angegebene Spaltenliste in der gleichen Reihenfolge von links nach rechts wie in der CSV-Datei sein und die gleiche Anzahl von Einträgen haben wie die CSV-Datei Spalten hat. Wenn Sie also schreiben:

COPY con (date,kgs)

dann erwartet PostgreSQL eine Eingabe-CSV mit genau zwei Spalten . Es verwendet die erste CSV-Spalte für das "date" Tabellenspalte und die zweite CSV-Spalte für "kgs" Tabellenspalte. Es spielt keine Rolle, was die CSV-Header sind, sie werden ignoriert, wenn Sie WITH (FORMAT CSV, HEADER ON) angeben , oder als normale Datenzeilen behandelt, wenn Sie HEADER nicht angeben .

PostgreSQL 9.4 fügt FROM PROGRAM hinzu zu COPY , sodass Sie einen Shell-Befehl ausführen könnten, um die Datei zu lesen und zu filtern. Ein einfaches Python- oder Perl-Skript würde die Arbeit erledigen.

Wenn es sich um eine kleine Datei handelt, öffnen Sie einfach eine Kopie in der Tabelle Ihrer Wahl als CSV-Datei, löschen Sie die unerwünschten Spalten und speichern Sie sie, also nur das date und kgs Spalten bleiben.

Alternativ COPY in eine Staging-Tabelle, die dieselben Spalten wie die CSV hat , dann INSERT INTO ... SELECT um nur die gewünschten Daten in die reale Zieltabelle zu übertragen.