1

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

fdw 表由以下人员创建:

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

1 回答 1

1

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

我已使用此命令将 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 清理过程。

于 2017-08-04T09:08:33.797 回答