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.