2016-08-09 2 views
0

最後の行、つまり予告編の行をスキップして、CSVファイルをデータベース表にインポートします。 私はファイルをインポートするためにOracleの外部テーブル方法を使用しています。私の知る限りでは、外部テーブルのヘッダーをスキップしてインポートする方法しかありません。しかし、私はトレーラーをスキップしてインポートしたい。どうすればいいですか?続きOracleが予告編の行をスキップする

は私のコードです:

CREATE OR REPLACE DIRECTORY ext_tab_data AS 'C:\Users\hello\Desktop\'; 

CREATE TABLE buildinfo_ext (
    "BUILD NO" NUMBER NOT NULL ENABLE, 
    "DATE" DATE NOT NULL ENABLE 
) 
ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY ext_tab_data 
    ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE 
    SKIP 1 
    FIELDS TERMINATED BY ',' 
    MISSING FIELD VALUES ARE NULL 
    (
     "BUILD NO" NUMBER NOT NULL ENABLE, 
     "DATE" DATE NOT NULL ENABLE 
    ) 
) 
    LOCATION ('Info.csv') 
) 
PARALLEL 5 
REJECT LIMIT UNLIMITED; 

これで私を助けてください。

ありがとうございます。

良い日!!!!

+2

予告編の記録はどのようなものですか?サンプルのCSVファイルを表示すると便利です。 –

+0

データがわからないようなシナリオを見てみましょうが、データがどのように表示されても最後の行はスキップします。しかし、我々はそれがいくつかの区切り文字を持つcsvファイルであることだけを知っています。 – anishroniyar

答えて

0

これは、最初の行をスキップしなければならない:

... 
RECORDS DELIMITED BY NEWLINE 
SKIP 1 
FIELDS TERMINATED BY ',' 
... 

別のアプローチは、行番号を表し、その後、あなたのテーブルを照会しながら、それを使用するフィールドを追加することができます。あなたは、単に行番号を確認し、最初と最後の行を同じように扱うことができる。このように

... 
"DATE" DATE NOT NULL ENABLE, 
LINE_NUMBER RECNUM 
... 

:このフィールドを追加すると、ファイル内の行数を含むフィールドLINE_NUMBERを作成する必要があります。

+0

OPでは、予告編のレコードを除外します。 – XING

+0

これはヘッダー行をスキップするだけです。私は最後の行をスキップしたい。 – anishroniyar

+0

行番号を含むフィールドを追加することで、必要なすべての行をスキップできます。 – Aleksej

0

フィルタリングのロジックを以下のように考えてみることができます。 PSこれはテストされたコードではありません。

CREATE TABLE buildinfo_ext (
    "BUILD NO" NUMBER NOT NULL ENABLE, 
    "DATE" DATE NOT NULL ENABLE 
) 
ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY ext_tab_data 
    ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE 
    FIELDS TERMINATED BY ',' 
    MISSING FIELD VALUES ARE NULL 
    (
     "BUILD NO" NUMBER NOT NULL ENABLE, 
     "DATE" DATE NOT NULL ENABLE 
    ) 
    REJECT ROWS WITH ALL NULL FIELDS      ----You can try check if that records is null. Or some other logic, 
    (
    "BUILD NO" NUMBER 
    TERMINATED BY "," OPTIONALLY ENCLOSED BY '"', 
    "DATE" DATE 
    ) 
) 
    LOCATION ('Info.csv') 
) 
PARALLEL 5 
REJECT LIMIT UNLIMITED; 
0

我々はデータを知らないが、今、我々は最後の行に

をスキップするようにあなたのデータについて何も知らない場合はシナリオを見てみましょう(例えばそれはdoesnのあなたが探すことができるトレーラーのビルド番号フィールドには魔法の番号があります;とにかく番号ではないので、とにかく拒否されません;など)はthe PREPROCESSOR clauseで、最後にあなたのためにファイルのラインアウト。例えば

、私はa simple executable shell scriptが(同じディレクトリに、それができる - とすべきである - どこか別のこと)remove_last_lineと呼ばれる作成した場合だけsedコマンドの呼び出し(またはGNU /usr/bin/head --lines=-1 $1コマンドは、Linux上であまりにも動作します)を含む:

#!/bin/bash 
/bin/sed '$d' $1 

その後、私はそれがロードされる前に、ファイルがその通過させることがしたいことをオラクルに伝えることができます:

CREATE TABLE buildinfo_ext (
    "BUILD NO" NUMBER, 
    "DATE" DATE 
) 
ORGANIZATION EXTERNAL (
    TYPE ORACLE_LOADER 
    DEFAULT DIRECTORY ext_tab_data 
    ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE 
    SKIP 1 
    PREPROCESSOR 'remove_last_line' 
    FIELDS TERMINATED BY ',' 
    MISSING FIELD VALUES ARE NULL 
    (
     "BUILD NO", 
     "DATE" CHAR(10) DATE_FORMAT DATE MASK "YYYY-MM-DD" 
    ) 
) 
    LOCATION ('Info.csv') 
) 
--PARALLEL 5 
REJECT LIMIT UNLIMITED; 

それが衝突するように私はPARRALELオプションを無効にしましたSKIPであるが、プリプロセッサにヘッダを削除することもできます。私は他のビットも少し微調整しました。私はテーブルを照会するとき

Build number,Date 
1,2016-07-01 
2,2016-07-02 
2 records 

は、私が唯一のファイルから2つの有効な行を参照してください:次に

私はInfo.csvを含む作成しませ.badファイルが生成されません

select * from buildinfo_ext; 

    BUILD NO DATE  
---------- --------- 
     1 01-JUL-16 
     2 02-JUL-16 

、および.logファイルに問題は報告されません。

LOG file opened at 08/09/16 15:56:14 

KUP-05004: Warning: Intra source concurrency disabled because parallel select was not requested. 

KUP-05007: Warning: Intra source concurrency disabled because the preprocessor option is being used. 

Field Definitions for table BUILDINFO_EXT 
    Record format DELIMITED BY NEWLINE 
    Data in file has same endianness as the platform 
    Rows with all null fields are accepted 

    Fields in Data Source: 

    BUILD NO      CHAR (255) 
     Terminated by "," 
     Trim whitespace same as SQL Loader 
    DATE       CHAR (10) 
     Date datatype DATE, date mask YYYY-MM-DD 
     Terminated by "," 
     Trim whitespace same as SQL Loader 

Date Cache Statistics for table BUILDINFO_EXT 
    Max Size:  1000 
    Entries :   2 
    Hits :   0 
    Misses :   0 

Windows上のディレクトリパスから、プリプロセッサバッチスクリプトと同様のことができます。他のオペレーティングシステムでも、同じ効果を達成するために異なるスクリプトが必要な場合があります。

+0

あなたはシェルスクリプトのremove_last_lineも投稿してください。 – XING

+0

@Raj_Te - 私のシェルスクリプトは、最初のコードブロックに示されている1行です。私は 'preprocessor'節からの引数で' head'を直接呼び出すことができないので、スクリプトに入れる必要があります。シェルディレクティブを追加して、それをもっと明白にします。 –

+0

解決策はうまくいくように見えますが、その方がOS指向です。私はKORNシェルを使用し、私の場合は動作しません。 – XING

関連する問題