Dal momento che non conosci il numero/i tipi di righe in anticipo, ti suggerirei di fare in questo modo:
- (1) importa il tuo CSV in una tabella (temporanea?) con una singola colonna di testo senza dividere. Usa
backspace
carattere come delimitatore in modo che l'intera riga importata rimanga intatta;
CREATE TABLE IF NOT EXISTS rawtext_t (rawtext text);
COPY rawtext_t FROM <file_name> WITH (format 'csv', delimiter E'\b');
- (2) esegue una query che divide il CSV in un array di testo
- funzione
parse_csv
, quindi utilizza il set risultante di array di testo come pertinente (magari mappa/inserisci nella tabella di destinazione "reale")
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;
Puoi aggiungere un WHERE
clausola nel secondo SELECT
istruzione per filtrare le righe in entrata, se necessario.
Un'altra opzione - a mio avviso molto valido - è usare l'eccellente file_textarray_fdw più o meno lo stesso effetto.
Spero che questo ti dia idee e aiuti.