Postgresql 9.5.7:从外部数据包装器 table(围绕 csv)插入时是否可以跳过缺少数据的行?

Postgresql 9.5.7: Is it possible to skip a row with missing data when inserting from a foreign data wrapper table (around a csv)?

所以我将这个大的 CSV 文件作为外部数据包装器 table 包含在我的数据库中,我想将其内容复制到适当的 table 中。但是 CSV 部分格式错误,并且由于某些行的数据值太多或太少,多次出现 'extra data' 或 'missing data' 错误。我知道我可以在导入之前手动修改 CSV 文件,但我更喜欢跳过这些行的方法。有没有办法做到这一点?

fdw table 由以下人员创建:

CREATE EXTENSION file_fdw;
CREATE SERVER import_server FOREIGN DATA WRAPPER file_fdw;

因此,我通过以下方式成功解决了该问题:

我已使用此命令将 csv 文件作为纯文本文件包含在 table 中:

CREATE FOREIGN TABLE table_csv (
    VALUE TEXT
)
SERVER csv_import_server OPTIONS(
filename './data.csv', format 'text');

所以 csv 中的所有数据都没有按它们的列分隔,而是所有内容都集中在一个丑陋的文本列中。

然后我通过使用这样的命令拆分外部 table 中的单个列,插入到具有适当列结构的 table 中:

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 清理过程。