Eftersom du inte känner till antalet/typerna av rader i förväg skulle jag föreslå att du gör så här:
- (1) importera din CSV till en (tillfällig?) tabell med en enda textkolumn utan att dela. Använd
backspace
tecken som avgränsare så att hela den importerade raden förblir intakt;
CREATE TABLE IF NOT EXISTS rawtext_t (rawtext text);
COPY rawtext_t FROM <file_name> WITH (format 'csv', delimiter E'\b');
- (2) kör en fråga som delar upp CSV-filen i en textmatris
- funktion
parse_csv
, och använd sedan den resulterande uppsättningen textmatriser som relevant (kanske mappa/infoga i den "riktiga" måltabellen)
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;
Du kan lägga till en WHERE
sats i den andra SELECT
uttalande för att filtrera inkommande rader vid behov.
Ett annat alternativ - enligt min uppfattning mycket bra - är att använda den utmärkta file_textarray_fdw till mer eller mindre samma effekt.
Hoppas att detta ger dig idéer och hjälp.