2017-07-26 5 views
0

私はコマンドラインからPostgreSQLのためにアップロードしていますcsvファイルで違法フォーマットされた日付を無視しようとしています:DATESTYLEは形式にpostgresqlを無視

Error: date/time field value out of range:"199999999" 

問題がある、私はCSV形式でデータを変更することはできませんファイルなので、この悪い日をそのままインポートする方法を見つけなければなりません。

答えて

1

中間テーブル(loaded_data)を使用して、CSVから取得したデータを保存します。テーブル内のすべてのカラムのタイプがtextであることを確認して、PostgreSQLがを実質的に何でも受け入れるようにします(間違ったカラム数のローを持っていない限り)

あなたがそのテーブル内のすべてのデータを持っていたら、その値が正しくないときに、NULLにそれらを設定し、それらを捨てる(DELETEそれらを)、またはデフォルト値にこれらの列を設定するいずれかのように、すべての列をサニタイズ。あなたが実際に行うことは、あなたの特定のアプリケーションに依存します。

データを消毒する最も簡単な方法は、テキストを適切な型に変換する関数を使用することです。入力が整形されていない場合は、例外を処理します。この関数の動作は、datestyleのためにあなたの設定に依存すること

-- Create a function to get good dates... and return NULL if they're not 
CREATE FUNCTION good_date(date_as_text text) 
    RETURNS DATE  /* This is the type of the returned data */ 
    IMMUTABLE STRICT /* If you pass a NULL, you'll get a NULL */ 
    LANGUAGE PLPGSQL /* Language used to define the function */ 
AS 
$$ 
BEGIN 
    RETURN CAST(date_as_text AS DATE) ; 
EXCEPTION WHEN OTHERS THEN /* If something is wrong... */ 
    RETURN NULL ; 
END 
$$ ; 

注:dateタイプの場合には、次の機能を使用することができます。ただし、January 8, 1999のようなテキストでは常に使用でき、2017-02-30またはFebruary 30, 2017などの日付の場合はNULLが返されます。

good_integerの機能と同等の機能を実行します。


は、あなたがこの入力データがあると仮定してみましょう:

CREATE TABLE loaded_data 
(
    some_id text, 
    some_date text 
) ; 

-- Let's assume this is the equivalent of loading the CSV... 
INSERT INTO loaded_data 
    (some_id, some_date) 
VALUES 
    (1, '20170101'), 
    (2, '19999999'), 
    (3, 'January 1, 1999'), 
    (4, 'February 29, 2001'), 
    (5, '20170230'); 

を...そして、あなたは、次の表に、この情報を保存すること:

CREATE TABLE destination_table 
( 
    id integer PRIMARY KEY, 
    a_date date 
) ; 

...あなたを」 d使用:

INSERT INTO destination_table 
    (id, a_date) 
SELECT 
    good_integer(some_id) AS id, good_date(some_date) AS a_date 
FROM 
    loaded_data ; 

あなたは:

SELECT * FROM destination_table; 
 
id | a_date  
-: | :--------- 
1 | 2017-01-01 
2 | null  
3 | 1999-01-01 
4 | null  
5 | null  

dbfiddle here


代替ですべての設定を確認してください:同等の機能を実行することができ、いくつかのETLツール]を使用します。私が提示したシナリオは、何とかして非常に単純なLTE(負荷、変換、抽出)同等のものです。

関連する問題