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

POSTGRES COPY FROM PROGRAM in eine dynamische Tabelle mit unbekannten Spalten

Da Sie die Anzahl/Art der Zeilen im Voraus nicht kennen, würde ich vorschlagen, dass Sie Folgendes tun:

  • (1) Importieren Sie Ihre CSV-Datei in eine (temporäre?) Tabelle mit einer einzigen Textspalte ohne Aufteilung. Verwenden Sie die backspace Zeichen als Trennzeichen, damit die gesamte importierte Zeile intakt bleibt;
CREATE TABLE IF NOT EXISTS rawtext_t (rawtext text);
COPY rawtext_t FROM <file_name> WITH (format 'csv', delimiter E'\b');
  • (2) Führen Sie eine Abfrage aus, die die CSV-Datei in ein Textarray aufteilt - Funktion parse_csv , und verwenden Sie dann den resultierenden Satz von Textarrays nach Bedarf (möglicherweise zuordnen/in die 'echte' Zieltabelle einfügen)
WITH rawdata AS
(
 SELECT parse_csv(rawtext) arr FROM rawtext_t
) 
INSERT INTO real_t (...fields...) 
SELECT arr[1], arr[3], ...
FROM rawdata;

TRUNCATE TABLE rawtext_t;

Sie können ein WHERE hinzufügen -Klausel im zweiten SELECT -Anweisung, um ggf. eingehende Zeilen zu filtern.

Eine weitere Option - meiner Meinung nach sehr gut - ist die Verwendung des hervorragenden file_textarray_fdw zu mehr oder weniger dem gleichen Effekt.

Ich hoffe, dass dies Ihnen Ideen und Hilfestellungen gibt.