Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.15.3 ADB_CSVREAD関数

CSVファイル中のデータを,HADBサーバが検索できる表形式に変換します。

メモ
  • CSVファイル中のデータの検索の概要については,マニュアルHADB システム構築・運用ガイドCSVファイル中のデータの検索を参照してください。

  • CSVファイル中のデータを検索するときの運用については,マニュアルHADB システム構築・運用ガイドCSVファイル中のデータを検索するときの運用を参照してください。

〈この項の構成〉

(1) 指定形式

ADB_CSVREAD関数::=
    〔MASTER.〕ADB_CSVREAD(CSVファイルのパス名指定,関数オプション指定)
 
        CSVファイルのパス名指定::=マルチ集合値式
 
        関数オプション指定::='関数オプション〔;関数オプション〕…〔;〕'
          関数オプション::={圧縮形式オプション指定列オプションバイナリ文字列形式オプション囲み文字指定オプション区切り文字指定オプション

(2) 指定形式の説明

CSVファイルのパス名指定

ADB_CSVREAD関数の入力情報となるCSVファイルのパス名を,マルチ集合値式の形式で指定します。マルチ集合値式については,「7.16 マルチ集合値式」を参照してください。

指定規則を次に示します。

  • マルチ集合値式の結果のデータ型は,文字データになるようにしてください。

  • CSVファイルのパス名指定に指定するCSVファイルのパス名は,絶対パスで指定してください。

    この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

  • CSVファイルのパス名指定に指定するCSVファイルのパス名は,存在するファイルを指定してください。

    この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

関数オプション指定

次に示すADB_CSVREAD関数のオプションを指定します。

  • 圧縮形式オプション

  • 指定列オプション

  • バイナリ文字列形式オプション

  • 囲み文字指定オプション

  • 区切り文字指定オプション

各オプションについては,「(3) 圧縮形式オプション」以降で説明します。

指定規則を次に示します。

  • 関数オプション指定は,文字列定数の形式で指定します。文字列定数の記述形式については,「6.3.2 定数の記述形式」を参照してください。

  • 関数オプション指定全体をアポストロフィ( ' )で囲んでください。

  • 複数の関数オプションを指定する場合は,セミコロン( ; )で区切って指定してください。

  • 関数オプションの指定順序に決まりはありません。

  • 同じ関数オプションを重複して指定できません。

  • 関数オプション中に指定した半角英小文字は,半角英大文字として扱われます。ただし,囲み文字および区切り文字については,半角英小文字と半角英大文字を区別します。

  • 分離符号は,オプションおよび特殊記号(「,」,「-」,「:」,「;」,「=」,「NL」,「CR」,「半角空白」,「全角空白」)の前後に指定できます。

(3) 圧縮形式オプション

圧縮形式オプションには,CSVファイルの圧縮形式を指定します。圧縮形式オプションは省略できません。

(a) 指定形式

COMPRESSION_FORMAT={GZIP|NONE}

(b) 指定形式の説明

GZIP

CSVファイルがGZIP形式で圧縮されているときに指定します。

NONE

CSVファイルが圧縮されていないときに指定します。

(4) 指定列オプション

指定列オプションには,CSVファイル中のフィールドデータのフィールドデータ番号を指定します。フィールドデータ番号とは,CSVファイル中のフィールドデータの並び順を表す番号です。レコードの先頭のフィールドデータを1とし,順番に2,3,…となります。

(例)

[図データ]

ここで指定したフィールドデータ番号に対応したフィールドデータが,ADB_CSVREAD関数によって取り出されます。

(a) 指定形式

FIELD_NUM=フィールドデータ番号指定〔,フィールドデータ番号指定〕…

(b) 指定形式の説明

フィールドデータ番号指定

取り出し対象とするフィールドデータのフィールドデータ番号を指定します。

複数のフィールドデータ番号を指定する場合は,コンマ( , )で区切って指定してください。また,フィールドデータ番号を「1-5」のように範囲指定することもできます。

(例)

FIELD_NUM=3            ...1
FIELD_NUM=1,3,4,6      ...2
FIELD_NUM=1,3-5,8-10   ...3
  1. フィールドデータ番号3のフィールドデータが取り出し対象になります。

  2. フィールドデータ番号1,3,4,6のフィールドデータが取り出し対象になります。

  3. フィールドデータ番号1,3〜5,8〜10のフィールドデータが取り出し対象になります。

(c) 規則

  1. 取り出し対象のフィールドデータの列数と,表関数列リストに指定した列数を同じにする必要があります。

    (例)

    [図データ]

    表関数列リストについては,「7.11.1 表参照の指定形式」の「(2) 指定形式の説明」を参照してください。

  2. フィールドデータ番号には,1〜30,000の符号なし整数定数が指定できます。

  3. フィールドデータ番号は重複して指定できません。

    (例)エラーになる例

    FIELD_NUM=1,2,2 ←2が重複しているためエラー
    FIELD_NUM=1,1-3 ←1が重複しているためエラー
  4. 対象となるフィールドデータの列数が,4,000以下になるようにしてください。

    (例)エラーになる例

    FIELD_NUM=1-4001 ←対象となるフィールドデータの列数が4,001のためエラー
  5. フィールドデータ番号に対応するフィールドデータがない場合,エラーになります。例えば,フィールドデータが5列のときに,次のような指定をした場合,エラーになります。

    (例)エラーになる例

    FIELD_NUM=6
    FIELD_NUM=1-7

    フィールドデータが5列しかないため,フィールドデータ番号6以降は指定できません。

    なお,この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

  6. 指定列オプションを省略した場合,「1〜表関数列リストに指定した列数」のフィールドデータ番号が指定されたと仮定されます。フィールドデータ番号に対応するフィールドデータがない場合は,表関数導出表にはナル値が格納されます。

    (例)

    SELECT * FROM TABLE(ADB_CSVREAD(MULTISET['/dir/file.csv.gz'],
                                   'COMPRESSION_FORMAT = GZIP;'))
                    AS "T1" ("C1" INTEGER,"C2" INTEGER,"C3" INTEGER,
                             "C4" INTEGER,"C5" INTEGER)

    下線部分が,表関数列リストの指定です。

    [図データ]

    CSVファイル中のフィールドデータは3列です。一方,表関数列リストに指定した列数は5列です。そのため,表関数導出表のC4列とC5列にはナル値が格納されます。

(5) バイナリ文字列形式オプション

バイナリ文字列形式オプションには,CSVファイル中のバイナリデータ(BINARYVARBINARY)の形式を指定します。

(a) 指定形式

BINARY_STRING_FORMAT=フィールドデータ番号指定:バイナリ形式指定
                  〔,フィールドデータ番号指定:バイナリ形式指定〕…
 
  バイナリ形式指定::={HEX|BIN}

(b) 指定形式の説明

フィールドデータ番号指定

CSVファイル中のバイナリデータのフィールドデータ番号を指定します。フィールドデータ番号指定の指定規則については,「(4) 指定列オプション」を参照してください。

ここで指定するフィールドデータ番号は,指定列オプション(FIELD_NUM)で指定したフィールドデータ番号の中から指定する必要があります。

(例)

FIELD_NUM=1-5;BINARY_STRING_FORMAT=1:BIN,4-5:HEX;

指定列オプションを省略した場合は,表関数導出表の列数以下の整数を指定してください。

バイナリ形式指定

バイナリデータの形式を指定します。

HEX

バイナリデータが16進形式の場合に指定します。

BIN

バイナリデータが2進形式の場合に指定します。

バイナリ文字列形式オプションの指定例を次に示します。

(例)
SELECT * FROM TABLE(ADB_CSVREAD(MULTISET['/dir/file.csv.gz'],
                               'COMPRESSION_FORMAT = GZIP;
                                BINARY_STRING_FORMAT=3:BIN,4:HEX;'))
                AS "T1" ("C1" INTEGER,"C2" INTEGER,
                         "C3" BINARY(1),"C4" BINARY(1),"C5" BINARY(1))

下線部分がバイナリ文字列形式オプションの指定です。

[図データ]

[説明]

  • C3列〜C5列に対応するフィールドデータはバイナリデータです。

  • C3列に対応するバイナリデータは2進形式のため,バイナリ形式指定にBINを指定します。

  • C4列に対応するバイナリデータは16進形式のため,バイナリ形式指定にHEXを指定します。

  • C5列に対応するバイナリデータは16進形式のため,バイナリ形式指定を省略しています(省略値はHEX)。

(c) 規則

  1. 表関数導出表にバイナリデータの列が指定されているときに,バイナリ文字列形式オプションを省略すると,バイナリ文字列形式オプションに次の指定がされていると仮定されます。

    • 表関数導出表のバイナリデータの列に対応するフィールドデータ番号指定が指定されている

    • バイナリ形式指定にHEXが指定されている

  2. フィールドデータ番号に対応する表関数導出表の列のデータ型は,バイナリデータ(BINARYVARBINARY)にしてください。

(6) 囲み文字指定オプション

囲み文字指定オプションには,CSVファイル中のフィールドデータを囲んでいる囲み文字を指定します。

(a) 指定形式

ENCLOSING_CHAR={囲み文字|NONE}

(b) 指定形式の説明

囲み文字

CSVファイル中のフィールドデータを囲んでいる囲み文字を指定します。囲み文字には1バイトの文字を指定できます。

留意事項を次に示します。

  • 次に示す文字などは,CSVファイル中のフィールドデータの文字と重なる可能性があるため,囲み文字には適していません。

    符号(+-),スラッシュ(/),コロン( : ),ピリオド( . ),|\[](){}~

  • 分離符号と同じ文字を囲み文字に指定しないでください。分離符号と同じ文字は囲み文字として見なされません(分離符号として扱われます)。そのため,囲み文字に分離符号と同じ文字を指定した場合,次に示す例のように意図しない結果となるおそれがあります。

    (例)囲み文字に分離符号である半角空白を指定した場合(△が半角空白を意味しています)

    '〜;ENCLOSING_CHAR=△;'

    この例の場合,HADBは,囲み文字にセミコロン( ; )が指定されたと認識します。

NONE

CSVファイル中のフィールドデータに,囲み文字を使用していない場合にNONEを指定します。

重要

フィールドデータ中に改行文字,または区切り文字と同じ文字がある場合は,NONEを指定しないでください。NONEを指定した場合,意図しない結果となるおそれがあります。

  • 改行文字がある場合,改行文字までが1行のデータとして扱われます。

  • 区切り文字と同じ文字がある場合,その文字が区切り文字として扱われます。

(c) 規則

  1. 囲み文字指定オプションを省略した場合,囲み文字として二重引用符(")が仮定されます。

  2. 次の文字は,囲み文字にはできません。

    • 空白,タブ,アスタリスク(*),改行(0x0A),復帰(0x0D

    • 区切り文字指定オプションに指定した区切り文字と同じ文字

  3. 囲み文字にアポストロフィ( ' )を指定する場合,アポストロフィを2個続けて指定してください。指定方法を次に示します。

    ENCLOSING_CHAR=''

(7) 区切り文字指定オプション

区切り文字指定オプションには,CSVファイル中のフィールドデータを区切っている区切り文字を指定します。

(a) 指定形式

DELIMITER_CHAR={区切り文字|TAB|SP}

(b) 指定形式の説明

区切り文字

CSVファイル中のフィールドデータを区切っている区切り文字を指定します。区切り文字には1バイトの文字を指定できます。

留意事項を次に示します。

  • 次に示す文字などは,CSVファイル中のフィールドデータの文字と重なる可能性があるため,区切り文字には適していません。

    符号(+-),スラッシュ(/),コロン( : ),ピリオド( . ),|\[](){}~

  • 分離符号と同じ文字を区切り文字に指定しないでください。分離符号と同じ文字は区切り文字として見なされません(分離符号として扱われます)。そのため,区切り文字に分離符号と同じ文字を指定した場合,次に示す例のように意図しない結果となるおそれがあります。

    (例)区切り文字に分離符号である半角空白を指定した場合(△が半角空白を意味しています)

    '〜;DELIMITER_CHAR=△;'

    この例の場合,HADBは,区切り文字にセミコロン( ; )が指定されたと認識します。

TAB

CSVファイル中のフィールドデータを,タブで区切っている場合にTABを指定します。

SP

CSVファイル中のフィールドデータを,空白で区切っている場合にSPを指定します。

(c) 規則

  1. 区切り文字指定オプションを省略した場合,区切り文字としてコンマ( , )が仮定されます。

  2. 次の文字は,区切り文字にはできません。

    • 英字(AZaz),数字(09),下線(_),二重引用符("),空白,タブ,アスタリスク(*),改行(0x0A),復帰(0x0D

    • 囲み文字指定オプションに指定した囲み文字と同じ文字

  3. 区切り文字にアポストロフィ( ' )を指定する場合,アポストロフィを2個続けて指定してください。指定方法を次に示します。

    DELIMITER_CHAR=''

(8) 規則

(a) ADB_CSVREAD関数に関する規則

CSVファイルのパス名指定に指定したマルチ集合値式の結果が空集合の場合,表関数導出表の結果も空集合になります。

(b) CSVファイルに関する規則

  1. CSVファイルは,次に示すどれかのファイルである必要があります。

    • OSのgzipコマンドで圧縮したGZIP形式のファイル

    • adbexportコマンドでエクスポートしたGZIP形式の出力データファイル

    • 圧縮していないCSVファイル

    この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

  2. CSVファイルには,HADB管理者に対する読み取り権限を付与してください。CSVファイルの格納ディレクトリには,HADB管理者に対する読み取り権限と実行権限を付与してください。

    この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

  3. CSVファイルのパス名の先頭または最後に空白がある場合,その空白は取り除かれて処理されます。

    (例)

    '△△△/dir/file.csv.gz' → '/dir/file.csv.gz'

    '/dir/file.csv.gz△△△' → '/dir/file.csv.gz'

    '△△△/dir/file.csv.gz△△△' → '/dir/file.csv.gz'

    '△△△/dir/fi△le.csv.gz△△△' → '/dir/fi△le.csv.gz'

    △:空白

    重要

    CSVファイルのパス名の先頭または最後に空白を指定しないでください。パス名の先頭または最後に空白を指定した場合,上記のように空白が取り除かれるため,意図しないパス名になるおそれがあります。

  4. CSVファイルのパス名の長さは,パス名の前後の空白を除き510バイト以下である必要があります。

    この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

(c) CSVファイルの形式に関する規則

  1. CSVファイル中の1行が,表関数導出表の1行のデータになります。行の終わりには,X'0A'(LF),X'0D0A'(CRLF),またはX'00'の改行文字を指定してください。

  2. フィールドデータとフィールドデータの間を,区切り文字で区切ってください。

  3. 囲み文字で囲まれている文字列は,すべてフィールドデータとして扱われます。

  4. CSVファイルのデータは,環境変数ADBLANGに指定した文字コードで作成してください。

  5. CSVファイル中に,EOF制御文字を指定しないでください。

  6. 囲み文字を指定する場合は,区切り文字と囲み文字を連続して指定してください。区切り文字と囲み文字の間に空白がある場合,空白はフィールドデータとして扱われます。その結果,囲み文字の指定不正によるエラーになったり,囲み文字がフィールドデータとして扱われたりすることがあります。

    なお,この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

  7. 囲み文字と同じ文字がフィールドデータ中にある場合,その文字を2個連続で記述してください。

    (例)アポストロフィ( ' )が囲み文字の場合

    'AB''CD'(フィールドデータ) → AB'CD(表関数導出表に格納されるデータ)

  8. フィールドデータの先頭の文字が囲み文字と同じ場合(先頭に半角空白またはタブがある場合を除く),囲み文字を指定する必要があります。

    (例)アポストロフィ( ' )が囲み文字の場合

    '''AB'(フィールドデータ) → 'AB(表関数導出表に格納されるデータ)

  9. 区切り文字と同じ文字がフィールドデータ中にある場合,フィールドデータを囲み文字で囲んでください。囲み文字で囲んでない場合,フィールドデータ中の区切り文字と同じ文字は,区切り文字として扱われます。その結果,指定したフィールドが存在しないなどのエラーになります。

    (例)囲み文字が二重引用符(")で,区切り文字がコンマ( , )の場合

    1,"foo,bar",3

    上記の場合,「1」,「foo,bar」,「3」の3列のフィールドデータと認識されます。

    1,foo,bar,3

    上記の場合,「1」,「foo」,「bar」,「3」の4列のフィールドデータと認識されます。

    なお,この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

  10. フィールドデータの文字列と,表関数導出表に格納されるデータの例を次に示します。この例では,区切り文字にコンマ( , )を使用しています。

    フィールドデータの文字列

    表関数導出表に格納されるデータ

    囲み文字指定オプションに二重引用符(")を指定した場合

    囲み文字指定オプションにNONEを指定した場合

    ABC,DEF

    • ABC

    • DEF

    • ABC

    • DEF

    "ABC""","DEF"

    • ABC"

    • DEF

    • "ABC"""

    • "DEF"

    "ABC,DEF"

    • ABC,DEF

    • "ABC

    • DEF"

    "ABC,DEF"

    エラー

    • "ABC

    • DEF

  11. CSVファイル中のフィールドデータは,表関数導出表の各列のデータ型に対応したデータに変換されます。そのため,表関数導出表の列のデータ型とフィールドデータの記述形式に互換性がある必要があります。フィールドデータの記述形式規則の詳細については,「6.2.2 変換,代入,比較できるデータ型」の「(4) 表関数導出表の列への格納代入(ADB_CSVREAD関数の場合)」を参照してください。

    なお,この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。

(9) 留意事項

  1. ADB_CSVREAD関数を指定したSQL文を実行する場合,HADBサーバはCSVファイルをオープンしてデータを読み込みます。そのため,SQL文の実行中は,CSVファイルを編集しないでください。

  2. 表関数列リストに指定した列のうち,検索結果に影響を与えない列(問合せで使用されない列)については,フィールドデータを取り出しません。また,その列に関する指定を削除したSQL文に自動的に変換されて実行されます。

    (例)

    [図データ]

    上記の例の場合,C2列とC5列が検索結果に影響を与えない列です。そのため,C2列とC5列に関する指定を削除したSELECT文に自動的に変換されて実行されます。青色の囲み部分が削除されてSELECT文が実行されます。

    メモ
    • 削除対象の指定を次に示します。

      ・表関数列リストに指定した列

      ・指定列オプションのフィールドデータ番号の指定

      ・バイナリ文字列形式オプションの指定

    • 列に関する指定が削除された場合,残った列のフィールドデータだけが取り出し対象となります。また,CSVファイルに関する規則についても,残った列のフィールドデータだけが対象になります。

    • 表関数導出表のすべての列の指定が削除対象となった場合,指定列オプションに指定したフィールドデータ番号のうち,番号が最も小さいフィールドデータ番号の列の指定だけが削除されません。

  3. ADB_CSVREAD関数の指定規則のうち,一部の規則はSQL文の実行時にチェックされます(SQL文の前処理時にはチェックされません)。SQL文の実行時にチェックされる規則には,「この規則は,SQL文の前処理時ではなく,SQL文の実行時にチェックされます。」の1文を記載しています。

(10) 例題

例題1

GZIP形式で圧縮したCSVファイル(/dir/file.csv.gz)から,次のデータを取り出します。

  • 顧客ID(USERID

  • 顧客名(NAME

  • 年齢(AGE

SELECT "USERID","NAME","AGE"
    FROM TABLE(ADB_CSVREAD(MULTISET ['/dir/file.csv.gz'],
                          'COMPRESSION_FORMAT=GZIP;'))
         AS "USERSLIST" ("USERID" CHAR(5),
                         "NAME" VARCHAR(100),
                         "AGE" INTEGER,
                         "COUNTRY" VARCHAR(100),
                         "INFORMATION" VARBINARY(10))

下線部分がADB_CSVREAD関数の指定です。

[図データ]

例題2

GZIP形式で圧縮したCSVファイル(/dir/file.csv.gz)から,次のデータを取り出します。

  • 顧客名(NAME

  • 出身国(COUNTRY

  • 各種フラグ情報(INFORMATION

SELECT "NAME","COUNTRY",BIN("INFORMATION")
    FROM TABLE(ADB_CSVREAD(MULTISET ['/dir/file.csv.gz'],
                          'COMPRESSION_FORMAT=GZIP;
                           FIELD_NUM=2,4,5;
                           BINARY_STRING_FORMAT=5:BIN;
                           ENCLOSING_CHAR=";
                           DELIMITER_CHAR=,;'))
         AS "USERSLIST" ("NAME" VARCHAR(100),
            "COUNTRY" VARCHAR(100),
            "INFORMATION" VARBINARY(10))

下線部分がADB_CSVREAD関数の指定です。

[図データ]

例題3

CSVファイル(/dir/file.csv)から,次のデータを取り出します。

  • 顧客ID(USERID

  • 顧客名(NAME

  • 年齢(AGE

SELECT "USERID","NAME","AGE"
    FROM TABLE(ADB_CSVREAD(MULTISET ['/dir/file.csv'],
                          'COMPRESSION_FORMAT=NONE;'))
         AS "USERSLIST" ("USERID" CHAR(5),
                         "NAME" VARCHAR(100),
                         "AGE" INTEGER,
                         "COUNTRY" VARCHAR(100),
                         "INFORMATION" VARBINARY(10))

下線部分がADB_CSVREAD関数の指定です。

[図データ]