PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

POSTGRES COPY FROM PROGRAM dans une table dynamique avec des colonnes inconnues

Puisque vous ne connaissez pas le nombre/les types de lignes à l'avance, je vous suggère de faire comme ceci :

  • (1) importez votre CSV dans un tableau (temporaire ?) avec une seule colonne de texte sans fractionnement. Utiliser backspace caractère comme délimiteur afin que toute la ligne importée reste intacte ;
CREATE TABLE IF NOT EXISTS rawtext_t (rawtext text);
COPY rawtext_t FROM <file_name> WITH (format 'csv', delimiter E'\b');
  • (2) exécuter une requête qui divise le CSV en un tableau de texte - fonction parse_csv , puis utilisez l'ensemble résultant de tableaux de texte selon les besoins (peut-être mapper/insérer dans la "vraie" table cible)
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;

Vous pouvez ajouter un WHERE clause dans le deuxième SELECT afin de filtrer les lignes entrantes si nécessaire.

Une autre option - un très bon dans ma compréhension - est d'utiliser l'excellent file_textarray_fdw plus ou moins le même effet.

J'espère que cela vous donnera des idées et vous aidera.