因此,我成功地通过以下方式解决了这个问题:
我已使用此命令将 csv 文件作为纯文本文件外部表包含在内:
CREATE FOREIGN TABLE table_csv (
VALUE TEXT
)
SERVER csv_import_server OPTIONS(
filename './data.csv', format 'text');
所以 csv 中的所有数据都没有被它们的列分开,而是所有东西都聚集在一个丑陋的文本列中。
然后我通过使用这样的命令拆分外部表中的单个列来插入具有适当列结构的表:
CREATE TABLE table_target (
id INTEGER PRIMARY KEY,
value1 TEXT,
value2 TEXT );
INSERT INTO table_target (id, value1, value2) SELECT
column1::INTEGER, value1, value2
FROM ( SELECT
SPLIT_PART ( value, ',', 1) AS id,
SPLIT_PART ( value, ',', 2) AS value1,
SPLIT_PART ( value, ',', 3) AS value2
FROM table_csv ) AS tmp WHERE (
tmp.id ~ '^[0-9]+$' AND
tmp.value1 != '' AND
tmp.value2 != '' );
经过广泛的测试,我可以导入任何格式错误的 csv,并能够在最后一个 WHERE 子句的帮助下过滤有效行。
虽然它有点慢,但很干净,中间没有任何外部中间 csv 清理过程。