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 清理过程。
所以我将这个大的 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 清理过程。