Como você não sabe o número/tipos de linhas antecipadamente, sugiro que faça assim:
- (1) importe seu CSV para uma tabela (temporária?) com uma única coluna de texto sem divisão. Use
backspace
caractere como delimitador para que toda a linha importada permaneça intacta;
CREATE TABLE IF NOT EXISTS rawtext_t (rawtext text);
COPY rawtext_t FROM <file_name> WITH (format 'csv', delimiter E'\b');
- (2) execute uma consulta que divide o CSV em uma matriz de texto
- função
parse_csv
e, em seguida, use o conjunto resultante de matrizes de texto conforme relevante (talvez mapeie/insira na tabela de destino 'real')
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;
Você pode adicionar um
WHERE
cláusula no segundo SELECT
instrução para filtrar as linhas de entrada, se necessário. Outra opção - um muito bom no meu entendimento - é usar o excelente file_textarray_fdw para mais ou menos o mesmo efeito.
Espero que isso lhe dê idéias e ajuda.