2017-08-03 4 views
0

私はこの大きなCSVファイルを外部データラッパーテーブルとしてデータベースに組み込みました。そのコンテンツを適切なテーブルにコピーしたいと思います。しかし、CSVは部分的に不正な形式であり、多すぎるデータ値や一部の行では少なすぎるため、複数の機会に「余分なデータ」や「欠落したデータ」というエラーが表示されます。インポートする前に手動でCSVファイルを変更できることは知っていますが、私はそれらの行をスキップする方法を好むでしょう。これを行う方法はありますか?PostgreSQL 9.5.7:外部データラッパーテーブル(csvの周り)から挿入するときに欠落したデータがある行をスキップできますか?

FDWテーブルがで作成されます。私は純粋なテキストファイル外国テーブルとして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で提供されているFDWほど厳密ではないようです。 – joanolo

+1

@joanolo:お返事ありがとうございます。私は自分の答えによって記述された方法でこの問題を回避することができました。乾杯! – onoSendai

答えて

1

、私は次の方法で問題を回避作業によってsuccededていますこのコマンドで:

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

の、CSV内のすべてのデータは、その列で区切られていないが、すべてが1つの醜いテキスト列に一緒に束ねています。

その後、私は、このようなコマンドを使用して、外部テーブル内の単一の列を分割することによって、適切な列構造を持つテーブルに挿入:

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-cleaning proceessはありません。

関連する問題