Kopieren Sie einige Spalten einer CSV-Datei in eine Tabelle
Ich habe eine CSV-Datei mit 10 Spalten. Nach dem erstellen einer PostgreSQL-Tabelle mit 4 Spalten, ich will zu kopieren 10 Spalten in die Tabelle ein.
die Spalten meiner CSV-Tabelle werden wie:
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
den Spalten von meiner PostgreSQL-Tabelle sollte wie:
x2 x5 x7 x10
InformationsquelleAutor der Frage POTENZA | 2012-09-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es sich um eine ad-hoc-Aufgabe
Erstellen Sie eine temporäre Tabelle mit allen Spalten in der input-Datei
Kopie von der Datei:
Legen Sie nun in die endgültige Tabelle aus dem temp -:
And drop:
Wenn es ist eine häufige Aufgabe
Verwenden Sie die
file_fdw
- Erweiterung. Als superuser:Grant select Berechtigung auf die Tabelle, um den Benutzer, der es Lesen wird:
Dann, wenn notwendig, Lesen Sie direkt aus der csv-Datei, als ob es eine Tabelle:
InformationsquelleAutor der Antwort Clodoaldo Neto
Können Sie die Spalten, die Sie wollen zu füllen mit den
COPY
Befehl. Etwa so:Hier ist der doc für die
COPY
Befehl.InformationsquelleAutor der Antwort Julien
Gerade hier angekommen, auf ein Streben nach einer Lösung, um nur laden einer Teilmenge der Spalten, aber scheinbar ist es nicht möglich. Also, nutzen Sie awk (oder
cut
) zum extrahieren der Spalten wollte, um eine neue Dateinew_file
:und laden Sie die
new_file
. Sie konnten leiten Sie die Ausgabe direkt inpsql
:InformationsquelleAutor der Antwort James Brown
Zum laden von Daten aus einer Tabellenkalkulation (Excel oder OpenOffice Calc) in postgreSQL:
Speichern Sie die Seite Tabelle als CSV-Datei. Bevorzugte Methode ist, öffnen Sie die Kalkulationstabelle auf OpenOffice Calc und machen die Rettung. Auf "Export to text file" wählen Sie als Zeichensatz Unicode (UTF8), Feld-Trennzeichen: "," und der Text Delimiter" -" ". Meldung angezeigt werden sagen nur aktive Blatt wird gespeichert. Hinweis: Diese Datei muss gespeichert werden, auf einem Ordner, aber nicht auf dem desktop und speichern müssen im UTF8-format (postgreSQL per dafault ist Schritt für UTF8-Kodierung). Wenn gespeichert auf desktop, postgreSQL geben wird "Zugriff verweigert" angezeigt und nicht hochgeladen.
In PostgreSQL erstellen Sie eine leere Tabelle mit der gleichen Anzahl von Spalten der Tabelle.
Hinweis: Auf jeder Spalte-Spalte-name muss derselbe sein, der Datentyp muss gleich sein. Auch im Auge behalten, die Länge der Daten, bei denen Zeichen unterschiedlicher mit genug Feld.
Dann auf postgreSQL, SQL-Fenster, setzen Sie den code:
kopieren "ABC"."def" aus E'C:\\tmp\\blabla.csv' Trennzeichen ',' CSV HEADER;
HINWEIS: Hier C:\\tmp ist der Ordner, wo die CSV-Datei "blabla" ist gespeichert. "ABC"."def" ist die erstellte Tabelle auf dem postgreSQL, wobei "ABC" schema-und"def" ist die tatsächliche Tabelle. Dann gehe auf "Abfrage ausführen" drücken der grünen Taste auf der Oberseite. "CSV-HEADER" ist erforderlich, wenn die CSV-Tabelle hat überschrift am Anfang jeder Spalte.
Wenn everythig ist ok, keine Fehlermeldung wird angezeigt und die Tabelle, die Daten aus einer CSV-Datei geladen werden, die in der postgreSQL-Tabelle. Aber wenn es eine Fehlermeldung gibt Folgendes machen:
Wenn die Fehlermeldung sagt, dass die Daten zu lang für eine bestimmte Spalte, dann erhöhen Sie die Spalte Größe. Dies geschieht meist auf den Charakter und der Charakter unterschiedlicher Spalte. Führen Sie dann die "Abfrage ausführen" - Befehl wieder.
Wenn die Fehlermeldung sagt, dass der Datentyp nicht mehr mit einer bestimmten Spalte, dann ändern Sie den Datentyp in postgreSQL-Tabelle-Spalte übereinstimmen, die in der CSV-Tabelle.
In Ihrem Fall, nach dem erstellen der CSV-Datei, löschen Sie unerwünschte Spalten und passen Sie die Spalten in der postgre-Tabelle.
InformationsquelleAutor der Antwort Sagun
Konnten Sie mit James Brown ' s Vorschlag weiter und Mach alles in einer Zeile:
cat Datei |awk -F ',' '{print $2","$5","$7","$10}' |psql -d-db -c "\kopieren MyTable von STDIN csv-header"
InformationsquelleAutor der Antwort Chris Lawton
Andere Antworten haben darauf hingewiesen, ist es möglich, zu spezifizieren, zu kopierenden Spalten in der PG-Tabelle. Jedoch ohne die Möglichkeit zur Referenz Spaltennamen in der CSV, hatte diese kleine utility-abgesehen von dem laden in eine Tabelle, wo die Spalten hatte eine andere Reihenfolge.
Glücklicherweise, wie der Postgres 9.3, es ist möglich, kopieren Sie Spalten nicht nur aus einer Datei oder von der Standardeingabe, sondern auch von einem shell-Befehl mit dem PROGRAMM:
Dies war das fehlende Stück, das wir benötigten für eine solche Spannung erwarteten Funktionalität. Zum Beispiel könnten wir diese option in Kombination mit
cut
(in einem UNIX-system) zum auswählen bestimmter Spalten Reihenfolge:COPY my_table (x2, x5, x7, x10) FROM PROGRAM 'cut -d "," -f 2,5,7,10 /path/to/file.csv' WITH (FORMAT CSV, HEADER)
Jedoch
cut
hat einige Einschränkungen beim Bearbeiten von CSV -: es kann nicht angemessen manipulieren strings mit Kommata (oder einem anderen delimeters) in Ihnen und nicht erlauben, wählen Sie die Spalten mit Namen.Gibt es mehrere andere open-source-Kommandozeilen-tools, die sind besser zu manipulieren und CSV-Dateien, wie
csvkit
odermiller
. Hier ist ein Beispiel für die Verwendungmiller
wählen Sie Spalten nach Namen: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)
InformationsquelleAutor der Antwort arredond