2017-08-03 19 views
0

因此,我将这个大的CSV文件作为外部数据包装表包含在我的数据库中,我想将其内容复制到适当的表中。但是CSV部分格式不正确,并且由于数据值过多或者某些行太少而导致多次出现“额外数据”或“缺少数据”错误。我知道我可以在导入之前手动修改CSV文件,但我更喜欢跳过这些行的方式。有没有办法做到这一点?Postgresql 9.5.7:从外部数据包装表(csv附近)插入时是否可以跳过缺少数据的行?

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

AFAIK,答案是否定的。文件(CSV)数据包装器需要CSV上的数据与定义一致。另外,其他FDW(请参阅https://wiki.postgresql.org/wiki/Foreign_data_wrappers#File_Wrappers)看起来与PostgreSQL提供的一样严格。 – joanolo

+1

@joanolo:谢谢你的回复;我可以用我自己的答案描述的方式解决这个问题。干杯! – onoSendai

回答

1

所以,我通过以下方式解决此问题的工作succeded:

我已经包括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清洁程序之间。

相关问题