所以我把这个大的CSV文件作为外部数据包装表包含在我的数据库中,我想将其内容复制到一个适当的表中。但是CSV部分格式不正确,并且由于数据值太多或某些行太少而多次给我"额外数据"或"丢失数据"错误。我知道我可以在导入之前手动修改 CSV 文件,但我更喜欢一种跳过这些行的方法。有没有办法做到这一点?
fdw 表由以下人员创建:
CREATE EXTENSION file_fdw;
CREATE SERVER import_server FOREIGN DATA WRAPPER file_fdw;
因此,我通过以下方式解决了该问题:
我已使用以下命令将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 清理过程。