it-swarm.com.de

Kopieren Sie einige Spalten einer CSV-Datei in eine Tabelle

Ich habe eine CSV-Datei mit 10 Spalten. Nachdem ich eine PostgreSQL-Tabelle mit 4 Spalten erstellt habe, möchte ich einige von 10 Spalten in die Tabelle kopieren.

die Spalten meiner CSV-Tabelle sind wie folgt:

x1 x2 x3 x4 x5 x6 x7 x8 x9 x10

die Spalten meiner PostgreSQL-Tabelle sollten wie folgt aussehen:

x2 x5 x7 x10
39
POTENZA

Wenn es sich um eine Ad-hoc-Aufgabe handelt

Erstellen Sie eine temporäre Tabelle mit allen Spalten in der Eingabedatei

create temporary table t (x1 integer, ... , x10 text)

Kopieren Sie aus der Datei hinein:

copy t (x1, ... , x10)
from '/path/to/my_file'
with (format csv)

Fügen Sie nun in die endgültige Tabelle aus der Zeit ein:

insert into my_table (x2, x5, x7, x10)
select x2, x5, x7, x10
from t

Und lass es fallen:

drop table t

Wenn es eine häufige Aufgabe ist

Verwenden Sie die Erweiterung file_fdw . Als Superuser:

create extension file_fdw;

create server my_csv foreign data wrapper file_fdw;

create foreign table my_csv (
    x1 integer,
    x2 text,
    x3 text
) server my_csv
options (filename '/tmp/my_csv.csv', format 'csv' )
;

Erteilen Sie dem Benutzer, der sie lesen wird, die Auswahlberechtigung für die Tabelle:

grant select on table my_csv to the_read_user;

Dann, wenn nötig, direkt aus der CSV-Datei lesen, als wäre es eine Tabelle

insert into my_table (x2)
select x2
from my_csv
where x1 = 2
56
Clodoaldo Neto

Sie können die Spalten, die Sie füllen möchten, mit dem Befehl COPY angeben. So wie:

\copy your_table (x2,x5,x7,x10) FROM '/path/to/your-file.csv' DELIMITER ',' CSV;

Hier ist das doc für den COPY Befehl.

26
Julien

Ich bin gerade auf der Suche nach einer Lösung angekommen, um nur eine Teilmenge von Spalten zu laden, aber anscheinend ist dies nicht möglich. Verwenden Sie also awk (oder cut), um die gewünschten Spalten in eine neue Datei zu extrahieren. new_file:

$ awk '{print $2, $5, $7, $10}' file > new_file

und lade den new_file. Sie könnten die Ausgabe direkt an psql übergeben:

$ cut -d \  -f 2,5,7,10 file | 
  psql -h Host -U user -c "\COPY table(col1,col2,col3,col4) FROM STDIN DELIMITER ' '" database
5
James Brown

Wie andere Antworten gezeigt haben, war es möglich, Spalten anzugeben, die in die PG-Tabelle kopiert werden sollen. Ohne die Option, Spaltennamen in der CSV zu referenzieren, war dies nur von geringem Nutzen, abgesehen vom Laden in eine Tabelle, in der Spalten eine andere Reihenfolge hatten.

Glücklicherweise ist es ab Postgres 9.3 möglich, Spalten nicht nur aus einer Datei oder aus einer Standardeingabe, sondern auch aus einem Shell-Befehl mit PROGRAM zu kopieren:

PROGRAMM

Ein auszuführender Befehl. In COPY FROM wird die Eingabe von der Standardausgabe des Befehls gelesen und in COPY TO wird die Ausgabe in die Standardeingabe des Befehls geschrieben.

Beachten Sie, dass der Befehl von der Shell aufgerufen wird. Wenn Sie also Argumente an den Shell-Befehl übergeben müssen, die aus einer nicht vertrauenswürdigen Quelle stammen, müssen Sie darauf achten, Sonderzeichen zu entfernen oder zu maskieren, für die möglicherweise eine besondere Bedeutung vorliegt die Shell. Aus Sicherheitsgründen empfiehlt es sich, eine feste Befehlszeichenfolge zu verwenden oder zumindest Benutzereingaben zu vermeiden.

Dies war das fehlende Teil, das wir für eine so mit Spannung erwartete Funktionalität brauchten. Beispielsweise könnten wir diese Option in Kombination mit cut (in einem UNIX-basierten System) verwenden, um bestimmte Spalten nach Reihenfolge auszuwählen:

COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'cut -d "," -f 2,5,7,10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)

cut hat jedoch einige Einschränkungen bei der Bearbeitung von CSVs: Zeichenfolgen mit Kommas (oder anderen Begrenzungszeichen) können nicht ausreichend bearbeitet werden, und es ist nicht möglich, Spalten nach Namen auszuwählen.

Es gibt mehrere andere Open Source-Befehlszeilentools, mit denen CSV-Dateien besser bearbeitet werden können, z. B. csvkit oder miller. Hier ist ein Beispiel mit miller, um Spalten nach Namen auszuwählen:

COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'mlr --csv lf cut -f x2,x5,x7,x10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)

4
arredond

Sie könnten den Vorschlag von James Brown weiter ausführen und alles in einer Zeile machen:

cat Datei | awk -F ',' '{print $ 2 "," $ 5 "," $ 7 "," $ 10} "| psql -d db -c"\kopiere MyTable aus STDIN-CSV-Header "

0
Chris Lawton

So laden Sie Daten aus einer Tabelle (Excel oder OpenOffice Calc) in postgreSQL:

Speichern Sie die Tabellenkalkulationsseite als CSV-Datei. Die bevorzugte Methode ist das Öffnen der Tabelle in OpenOffice Calc und das Speichern. Im Fenster "In Textdatei exportieren" wählen Sie Zeichensatz als Unicode (UTF8), Feldtrennzeichen: "," und Texttrennzeichen "" ". Es wird eine Meldung angezeigt, dass nur das aktive Blatt gespeichert ist. Hinweis: Diese Datei muss in einem Ordner gespeichert werden, jedoch nicht auf dem Desktop und muss im UTF8-Format gespeichert werden (postgreSQL von dafault wird für die UTF8-Codierung verwendet). Wenn auf dem Desktop gespeichert, gibt postgreSQL die Meldung "Zugriff verweigert" aus und kann nicht hochgeladen werden.

Erstellen Sie in PostgreSQL eine leere Tabelle mit derselben Spaltenanzahl wie das Arbeitsblatt.

Hinweis: In jeder Spalte muss der Spaltenname gleich sein, der Datentyp muss gleich sein. Beachten Sie auch die Länge der Daten, deren Zeichen mit genügend Feld variieren.

Dann in postgreSQL, im SQL-Fenster, den Code einfügen: 

kopiere "ABC". "def" von E'C: \\ tmp \\ blabla.csv 'Trennzeichen', 'CSV HEADER;

HINWEIS: Hier ist C: \\ tmp der Ordner, in dem die CSV-Datei „blabla“ gespeichert wird. "ABC". "Def" ist die in postgreSQL erstellte Tabelle, wobei "ABC" das Schema und "def" die eigentliche Tabelle ist. Dann führen Sie die Abfrage aus, indem Sie die grüne Taste oben drücken. “CSV HEADER” wird benötigt, wenn die CSV-Tabelle am Anfang jeder Spalte eine Überschrift hat.

Wenn alles in Ordnung ist, wird keine Fehlermeldung angezeigt und die Tabellendaten aus der CSV-Datei werden in die postgreSQL-Tabelle geladen. Wenn jedoch eine Fehlermeldung angezeigt wird, gehen Sie wie folgt vor:

Wenn die Fehlermeldung besagt, dass die Daten für eine bestimmte Spalte zu lang sind, erhöhen Sie die Spaltengröße. Dies geschieht meistens in Zeichen- und Zeichenvariationsspalten. Führen Sie dann erneut den Befehl "Abfrage ausführen" aus.

Wenn in einer Fehlermeldung angezeigt wird, dass der Datentyp nicht mit einer bestimmten Spalte übereinstimmt, ändern Sie den Datentyp in der Tabelle mit der Tabelle postgreSQL so, dass er mit dem in der CSV-Tabelle übereinstimmt.

Löschen Sie in Ihrem Fall nach dem Erstellen der CSV-Datei die unerwünschten Spalten und passen Sie die Spalten in der Postgre-Tabelle an.

0
Sagun

Wenn die Anzahl der importierten Zeilen für Sie nicht wichtig ist, können Sie auch:

erstelle zwei Tabellen:

  • t1 (x1 x2 x3 x4 x5 x6 x7 x8 x9 x10): mit allen Spalten der CSV-Datei
  • t2 (x2 x5 x7 x10): wie Sie es brauchen

dann erstelle:

  • eine Trigger-Funktion, bei der Sie stattdessen die gewünschten Spalten in t2 einfügen und NULL zurückgeben, um zu verhindern, dass diese Zeile in t1 eingefügt wird

  • ein Trigger für t1 (BEFORE INSERT FOR EACH ROW), der diese Funktion aufruft.

Insbesondere bei größeren csv-Dateien sind BEFORE INSERT-Trigger auch nützlich, um Zeilen mit bestimmten Eigenschaften vorab herauszufiltern, und Sie können auch Typkonvertierungen durchführen.

0
Michael Kraxner