私はコマンドラインからPostgreSQLのためにアップロードしていますcsvファイルで違法フォーマットされた日付を無視しようとしています:DATESTYLEは形式にpostgresqlを無視
Error: date/time field value out of range:"199999999"
問題がある、私はCSV形式でデータを変更することはできませんファイルなので、この悪い日をそのままインポートする方法を見つけなければなりません。
私はコマンドラインからPostgreSQLのためにアップロードしていますcsvファイルで違法フォーマットされた日付を無視しようとしています:DATESTYLEは形式にpostgresqlを無視
Error: date/time field value out of range:"199999999"
問題がある、私はCSV形式でデータを変更することはできませんファイルなので、この悪い日をそのままインポートする方法を見つけなければなりません。
中間テーブル(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(負荷、変換、抽出)同等のものです。