ヘッダーをスキップ
Oracle® OLAP DMLリファレンス
11gリリース2 (11.2)
B61346-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

FILEREAD

FILEREADコマンドは、入力ファイルからレコードを読み取り、指定したアクション文に従ってデータを処理します。FILEREADは、バイナリ・データ、パック10進データおよびテキストを処理します。E表記法(.1E+9など)またはM表記法(10Mなど)で記述された10進データを処理できます。データをOracle OLAP変数、ディメンション、コンポジットまたはリレーションに格納する前に、適切なデータ型に変換できます。

構文

FILEREAD fileunit [STOPAFTER n] [file-format] {[attribute...action-statement1}

     [[attribute...action-statementN...]

ここで、

  • file-formatは、入力ファイルのレコードの形式を指定します。次のいずれかを使用します。

    RULED
    CSV [DELIMITER dchar]
    STRUCTURED [TEXTSTART schar] [TEXTEND echar] [DELIMITER dchar
  • attributeは、アクション文によって使用される情報を指定します。

    {COLUMN|COL} n
    {SPACE|SP} n
    {FIELD|FLD} n
    {WIDTH|W} n
    data-type
    dimension-value-handling
    BINARY | PACKED | SYMBOLIC
    TRANSLATE | NOTRANSLATE
    SCALE n
    ZPUNCH | ZPUNCHL
    LSET 'text'
    RSET 'text'
    stripping
    NAVALUE val
    NASPELL 'text'
    ZSPELL 'text'
    YESSPELL 'text'
    NOSPELL 'text'
    ZEROFILL

    アクション文における属性の配置については、「FILEREADでのフィールド属性の配置」を参照してください。

  • action-statementsは処理を実行する文で、代入文やIF文などがあります。action-statementは、次のいずれかです。

    assignment-statement
    IF-statement
     SELECT-statement
    ACROSS-statement: action-statement
    <action-statement-group>

パラメータ

fileunit

FILEOPENファンクションを事前にコールすることによって読取り用(READモード)に開かれたファイルに割り当てられるファイル・ユニット番号。

STOPAFTER n

入力ファイルから読み取るレコードの数。STOPAFTERを省略した場合、あるいは負数またはNAを指定した場合、FILEREADはファイル全体を処理します。「STOPAFTERキーワード」を参照してください。

RULED

文字単位またはバイト単位の固定幅の列でレコードが編成されることを指定します。すべての行が同じ形式である必要があります。RULEDはデフォルトのファイル形式です。レコード内のデータの位置を指定するには、COLUMN、SPACEおよびWIDTH属性を使用します。

CSV [DELIMITER dchar]

CSVは、データがCSV(カンマ区切り値)形式であることを指定します。レコード内のデータの位置を指定するには、FIELDおよびSPACE属性を使用します。

dcharは、構造化ファイルでOracle OLAPが標準フィールド・デリミタとして解釈するようにする単一文字を指定するテキスト式です。Oracle OLAPは、標準フィールド・デリミタを使用して数値フィールドおよびテキスト・フィールドを識別します。デフォルト文字はカンマ(,)です。

CSVファイルは、スプレッドシート・プログラムによって生成される一般的な出力形式です。ソース・ファイルの文字の各行がシングル・レコードとして扱われます。レコードの各フィールドはデフォルトでカンマによって区切られます。フィールド・デリミタとして他の文字を指定するには、DELIMITERキーワードを使用します。

入力レコードの文字のグループが二重引用符で囲まれる場合、次のすべてのルールが適用されます。

  • そのグループに含まれるデリミタ文字は、デリミタではなくリテラルとして扱われます。

  • 文字のグループに含まれる二重引用符(")は、その後に別の二重引用符を付ける必要があります。

  • 文字のグループに含まれる改行文字(\n)は無視されます。

  • 文字のグループを囲む二重引用符の前後にあるスペースまたはタブは無視されます。

STRUCTURED

レコードが構造化prn形式であることを指定します。レコード内のデータの位置を指定するには、FIELDおよびSPACE属性を使用します。

構造化ファイルは、PCソフトウェア用の一般的な出力形式です。テキスト・ファイルとして、フィールドが文字のグループで構成されます。文字のグループは、二重引用符で囲まれたテキストまたは小数点による以外は中断されない数列の2つの条件によって定義されますしたがって、小数点を含む引用符で囲まれていない数列は単一の値として格納されますが、千の桁を区切るカンマまたはその他のデリミタを含む引用符で囲まれていない数列は、単一の値として格納されずに複数の値に分割されます。引用符で囲まれない数字以外の文字は無視されますが、数字の直前にあるマイナス記号のみは数字の一部とみなされます。マイナス記号と数字の間にスペースを入れても切り離せません。

ファイル形式が前述のパターンに従わない場合、TEXTSTART、TEXTENDおよびDELIMITERキーワードを使用して、各フィールドの先頭および末尾を識別するためにFILEREADが使用するデリミタをカスタマイズできます。

TEXTSTART schar

構造化ファイルでOracle OLAPがテキスト・フィールドの先頭として解釈するようにする単一文字を指定します。scharは文字の値です。デフォルト文字は二重引用符(")です。

TEXTEND echar

構造化ファイルでOracle OLAPがテキスト・フィールドの末尾として解釈するようにする単一文字を指定します。echarrは文字の値です。デフォルト文字は二重引用符(")です。

DELIMITER dchar

構造化ファイルでOracle OLAPが標準フィールド・デリミタとして解釈するようにする単一文字を指定します。Oracle OLAPは、標準フィールド・デリミタを使用して数値フィールドおよびテキスト・フィールドの両方を識別します。dcharは文字の値です。デフォルト文字はカンマ(,)です。

{COLUMN|COL} n

入力レコードでフィールドが開始する列。デフォルトでは、フィールド1は列1から開始し、それに続くフィールドは前のフィールドの後の列から開始します。現行フィールドのデフォルト列は、前のフィールドの最初の列、前のフィールドの幅、および現行フィールドに指定されるスペースの合計です。

表9-7 ファイル属性

構文 説明

{COLUMN|COL} n

入力レコードでフィールドが開始する列。デフォルトでは、フィールド1は列1から開始し、それに続くフィールドは前のフィールドの後の列から開始します。現行フィールドのデフォルト列は、前のフィールドの最初の列、前のフィールドの幅、および現行フィールドに指定されるスペースの合計です。

{SPACE|SP} n

フィールドと前のフィールドの間のスペースの数。構造化PRNファイルでは、前のフィールドと現行フィールドの間のフィールドの数。デフォルトは0

{FIELD|FLD} n

構造化PRNファイルの場合のみ、データの抽出元のフィールド。

{WIDTH|W} n

構造化されていないレコードの場合に、入力レコードでフィールドが占有する列の数。デフォルトがない場合、ルール化レコードにはWIDTHを含める必要があり、含めないとFILEREADはエラーを生成する。デフォルトは、次に示すようにデータ型から導出される。

  • INTEGERSHORTINTEGERまたはSHORTDECIMALのターゲット・データ型のBINARY入力形式の場合、デフォルトは4列。

  • DECIMALまたはNUMBERのターゲット・データ型のBINARY入力形式の場合、デフォルトは8列。

  • BOOLEANのターゲット・データ型のBINARY入力形式の場合、デフォルトは2列。

  • いずれかのターゲット・データ型のPACKED入力形式の場合、デフォルトはなし。

  • IDのターゲット・データ型のSYMBOLIC入力形式の場合、デフォルトは8列。

  • ID以外のターゲット・データ型のSYMBOLIC入力形式の場合、デフォルトはなし。

最大幅はテキスト入力で4,000文字。

data-type

使用できるキーワードは、INTEGER、SHORTINTEGER、DECIMAL、SHORTDECIMAL、NUMBER、TEXT、ID、DATE、VNF、RAW DATE、BOOLEAN。

  • テキスト・データの場合は、入力がアナリティック・ワークスペースに格納される前に変換されるデータ型。

  • バイナリ・データの場合は、入力レコードのデータのデータ型。

  • DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンション以外では、デフォルトはターゲット・オブジェクトのデータ型。

  • DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションでは、デフォルトはVNF。

  • DATE変数、およびDAY、WEEK、MONTH、QUARTER、YEAR型のディメンションでは、RAW DATEは、入力値が1899年12月31日から後の日数を表す正のINTEGER値または1899年12月31日より前の日数を表す負のINTEGER値であることを示す。

「NTEXT値を持つターゲット・オブジェクトの指定」を参照。

dimension-value-handling

ターゲット・オブジェクトがディメンションまたはディメンション・サロゲートである場合に、新しい値をターゲット・オブジェクトに追加するかどうかを指定する次のいずれかのキーワード句。

  • MATCH

    新しい値をディメンションまたはディメンション・サロゲートに追加しない。ただし、ターゲット・オブジェクトがディメンションである場合は、入力フィールドの値は現行ディメンション値と一致していなければならない。処理されるレコードごとに、ディメンションは一時的にレコードのその値に制限される。値が存在しない場合、FILEREADはエラーを生成する。この属性は、ターゲット・オブジェクトがディメンション・サロゲートである場合も適用される。

  • APPEND [LAST |FIRST | BEFORE pos | AFTER pos]

    新しい値を、追記の形でディメンションに追加する。フィールドには新しいディメンション値が含まれ、場合によって既存の値も含まれる。新しい値はディメンション・リストに追加され、ステータスは現行値に制限される。FILEREADの終了後、ステータスはALLに設定される。時間ディメンションの場合、既存の時間間隔と新しい時間間隔の間の欠落した時間間隔をOracle OLAPは自動的に埋める。ターゲット・オブジェクトが時間ディメンション以外のディメンションである場合は、LAST(ディメンション・リストの末尾に値を追加)、FIRST(リストの先頭に値を追加)、BEFORE pos(指定した値またはINTEGER位置の前に値を追加)、AFTER pos(指定した値またはINTEGER位置の後に値を追加)、のいずれかのキーワードを使用したOracle OLAPによる値の追加方法を指定できる。

  • ASSIGN

    新しい値を、代入の形でディメンション・サロゲートに追加する。この属性はディメンション・サロゲートにのみ適用される。この属性によって新しい値がサロゲートに代入される。

input-field-format

入力フィールドの形式を指定する次のいずれかのキーワード。

  • SYMBOLIC。入力フィールドの形式がASCIIまたはEBCDICテキストであることを指定する。

  • BINARY。入力フィールドの形式がバイナリであることを指定する。

  • PACKED。入力フィールドの形式がパック10進であることを指定する。

TRANSLATE|NOTRANSLATE

Oracle OLAPがデータを元のオペレーティング・システムの形式からFILESET ORIGIN文の指定のとおりに変換するかどうか。データを変換する場合はTRANSLATE、データを変換しない場合はNOTRANSLATEを指定する。

SCALE n

想定10進小数点または2進小数点の右側の桁の数。デフォルトは0。入力データがテキストの場合、SCALEによって指定される数より入力の小数点が優先される。

ZPUNCH|ZPUNCHL

入力ゾーンがどのようにオーバーパンチされているかを指定する。入力がゾーン・オーバーパンチである場合はZPUNCHを指定。入力の左がゾーン・オーバーパンチである場合はZPUNCHLを指定。

LSET 'text'

テキスト入力およびTEXTまたはIDターゲット・オブジェクトの場合に、格納の前にテキストを値の左に追加する。textが複数行の値の場合は、最初の行のみが使用される。

RSET 'text'

テキスト入力およびTEXTまたはIDターゲット・オブジェクトの場合に、格納の前にテキストを値の右に追加する。textが複数行の値の場合は、最初の行のみが使用される。

stripping

テキスト入力の場合に、入力値をターゲット・オブジェクトに格納する前に、それに含まれるスペースまたはNULLを削除するかどうかを指定する次のいずれかのキーワードを指定する。

  • NOSTRIP

    スペースまたはNULLを入力値から削除しない。

  • STRIP

    スペースおよびNULLを入力値の左右両方から削除する。

  • LSTRIP

    スペースおよびNULLを入力値の左側から削除する。

  • RSTRIP

    スペースおよびNULLを入力値の右側から削除する。




NAVALUE val

バイナリまたはパック入力の場合、入力が指定された数値であるときにNAがターゲット・オブジェクトに割り当てられることを指定します。

NASPELL 'text'

テキスト入力の場合に、Oracle OLAPがテキストをNAとして格納することを指定します。入力が指定されたテキストである場合、NAがターゲット・オブジェクトに割り当てられます。テキストは、複数のNA値を取れる複数行の文字列にできます。テキストに指定される値の他に、入力がNAである場合はNAがターゲット・オブジェクトに割り当てられます。

ZSPELL 'text'

テキストの数値入力の場合に、Oracle OLAPがテキストを0として格納することを指定します。入力が指定されたテキストである場合、ゼロがターゲット・オブジェクトに割り当てられます。テキストは、複数のゼロ値を取れる複数行の文字列にできます。テキストに指定される値の他に、入力が0である場合は0がターゲット・オブジェクトに割り当てられます。

YESSPELL 'text'

テキスト入力がBOOLEANである場合に、Oracle OLAPがテキストをYESとして格納することを指定します。入力がテキストである場合、YESがターゲット・オブジェクトに割り当てられます。テキストは、複数のYES値を取れる複数行の文字列にできます。textに指定される値の他に、入力がYES、ONまたはTRUEである場合はYESがターゲット・オブジェクトに割り当てられます。

NOSPELL 'text'

テキスト入力がBOOLEANである場合に、Oracle OLAPがテキストをNOとして格納することを指定します。入力がテキストである場合、NOがターゲット・オブジェクトに割り当てられます。テキストは、複数のNO値を取れる複数行の文字列にできます。'text'に指定される値の他に、入力がNO、OFFまたはFALSEである場合はNOがターゲット・オブジェクトに割り当てられます。

ZEROFILL

テキストの数値入力の場合に、Oracle OLAPが結果のテキストのスペースをゼロで埋めることを指定します。入力のスペースがゼロで置き換えられます。デフォルトはゼロによる埋込みを行いません。

action-statement

入力ファイルからレコードが読み取られるたびに実行するアクション文を1つ以上指定できます。通常、ディメンション・ステータスの設定、および入力レコードから取得されたデータのOracle OLAPのターゲット・オブジェクトへの割当てのために、アクション文を使用します。また、入力レコードのデータを参照しないアクション文を指定することもできます。たとえば、アクション文のうちの1つを、カウンタを増分するのみの代入文に指定できます。あるいは、特定の処理において入力データを使用するが、Oracle OLAPのターゲット・オブジェクトにはそのデータを割り当てないアクション文も可能です。

アクション文のリストでは、必ず変数の前にディメンションを処理してください。FILEREADは、入力レコードごとに各アクション文を左から右に処理します。アクション文でディメンション処理を実行すると、その結果得られたステータスは次のアクション文にも有効になります。変数のディメンションを制限するアクション文を最初に指定しない場合、FILEREADはステータスにある最初の値を使用して変数のセルをターゲットにします。ACROSS句を指定しないかぎり、FILEREADは入力レコードのフィールドの単一の値をOracle OLAP変数の単一セルに割り当てます。デフォルトでは、FILEREADはデータを変数に割り当てる際に変数のディメンションをループ処理しません「フィールド順序」を参照してください。

FILEREADアクション文にVALUEキーワードを使用して、入力レコードの特定フィールドの値を表します。VALUEは、指定したFILEREADの属性に従って書式化してそのデータを表します。レコードのフィールドが空白の場合、FILEREADはその値をNAとみなします。デフォルトでは、VALUEのデータ型はターゲット・オブジェクトのデータ型です。ただし、属性キーワードによって別のデータ型を指定できます。


注意:

FILEREADとともに使用するアクション文をすでに指定してある場合、必要に応じて代入文を調整してVALUEキーワードを削除するだけで、SQL FETCHおよびSQL IMPORTでコードを再利用できます。ディメンション処理を制御する属性を除く大部分のFILEREAD属性は、SQLロードに対しては意味がなく、SQL FETCHおよびSQL IMPORT内で実行する際には無視されます。

assignment-statement

代入文によって、Oracle OLAPオブジェクトに値を代入できます。代入文の形式は次のとおりです。

     object [= expression]

objectは、データを代入して格納するターゲットです。objectには、Oracle OLAP変数、ディメンション、ディメンション・サロゲート、コンポジットまたはリレーションを指定できます。

expressionは、ターゲットに代入されるデータ値のソースです。


重要:

SQL FETCHまたはSQL IMPORT代入文では、expression構成要素はオプションではありません。ただし、FILEREAD代入文はオブジェクト名のみで構成できます。その場合、入力データはobjectに直接代入されます。FILEREAD代入文のexpressionにはVALUEキーワードを含めることができます。

IF-statement

IF文では、ブール式がTRUEまたはFALSEのいずれであるかに従ってアクションを実行できます。IF文の形式は次のとおりです。

     IF bool-exp

       THEN action

      [ELSE action]

IFはブール式を評価します。TRUEの場合、THEN actionが発生します。FALSEの場合、ELSE actionが指定されていれば発生します。ブール式がNAの場合、actionは発生しません。

actionは、次のうちのいずれかを使用できます。

  • NULL(アクションは発生しません)

  • 代入文

  • SELECT文

  • IF文

  • action-statementsを含むDO … DOEND文

FILEREAD IF文にはVALUEキーワードの呼出しを含めることができます。FILEREAD IF文を使用することにより、1つのFILEREAD文で、様々なタイプのレコード(異なる構造や異なるターゲット・オブジェクトのレコードなど)を処理できます。

FILEREADでは、同じレコードから異なる値を表すために、VALUEキーワードを複数回使用できます。インスタンスごとに各値を読み取る列を指定します。

SELECT statement

SELECT文によって、式の値に基づいてアクションを実行できます。SELECT文の形式は次のとおりです。

     SELECT select-expression

        [WHEN expression1 action

        [WHEN expression2 action . . .]

     [ELSE action]

SELECTはSELECT式を評価し、その結果をWHEN式と順次比較します。最初に一致が見つかったところで、関連付けられたactionが発生します。一致が見つからない場合、ELSE actionが指定されていれば発生します。

SELECT文のactionはIF文のactionと同じです。

FILEREAD SELECT文にはVALUEキーワードの呼出しを含めることができます。FILEREAD SELECT文を使用することにより、1つのFILEREAD文で、様々なタイプのレコード(異なる構造や異なるターゲット・オブジェクトのレコードなど)を処理できます。

ACROSS-statement: action-statement

ACROSS文では、後に続くアクション文がACROSSディメンションのステータスにあるすべての値に対して1回ずつ実行されます。ループを複数のアクション文に適用するには、アクション文を山カッコで囲みます。

ACROSS文の構文は次のとおりです。

     ACROSS dimension [limit-clause]:

        action-statement

limit-clauseの構文は、各種LIMITコマンドにおけるlimit-clause引数の構文(つまり、LIMITコマンドの「TO」などのlimit-type引数の後の構文)と同じです。これらの引数の構文については、LIMITコマンド(値を使用)LIMITコマンド(LEVELRELを使用)LIMIT(親リレーションを使用)LIMITコマンド(関連ディメンションを使用)LIMITコマンド(NOCONVERTを使用)およびLIMITコマンド(POSLISTを使用)を参照してください。

次の例は、monthの現行のステータスにかかわらず、monthを最近の6つの値に制限します。

ACROSS month last 6: units

FILEREAD ACROSS文では、Oracle OLAPがACROSS句によって指定されるフィールドの読取りを開始するレコード内の位置を示す属性を指定できます。位置を指定するには、属性FIELD、SPACEおよびCOLUMNを使用します。ACROSS句で指定される一連のフィールドが構造化レコードのすぐ次のフィールドまたはルール化レコードのすぐ次のバイトから始まる場合、位置属性はオプションです。

<action-statement-group>

複数のアクション文は山カッコで囲んでグループ化できます。action-statement-groupの形式は次のとおりです。

     <action-statement1 -

     [action-statement2 . . .]>

アクション文のグループが使用されるのは、通常、ACROSS文の後です。山カッコの構文によって、ACROSSディメンションのステータスにあるすべての値に対して複数のアクション文を実行できます。

使用上の注意

一度に1つのレコードの読取り

FILEREADのかわりとして、レコードのフィールドを処理する1つ以上のFILEVIEW文とともに、一度に1つのレコードを読み取るFILENEXTファンクションを使用できます。

フィールド順序

入力レコードにディメンション値と変数データの両方が含まれる場合、ディメンション値はレコードで最初に読み取られるフィールドである必要があり、変数データ値はそのディメンション値の後に読み取られる必要があります。これに従うためには、入力レコードのフィールド自体を並べ替えるか、FILEREAD属性を使用してフィールド位置を明示的に指定します。(attribute引数の説明を参照してください。)

FILEREADで位置属性を使用する必要がないように入力レコードを編成するには、すべてのディメンション値をレコードの最初のフィールドに入れ、変数データ値をレコードの最後のフィールドに入れます。たとえば、同じディメンションを同じ順序(timeproductおよびgeography)で共有する2つの変数(unitsおよびsales)のデータがあるとします。この場合、次のサンプル入力レコードに示すように、入力レコードの最初の3つのフィールドにディメンション値を入れ、4番目と5番目のフィールドに変数データを入れます。

Sep99    Snowshoes    Boston    35    5565.95

STOPAFTERキーワード

デフォルトでは、FILEREADはファイルのすべてのレコードを自動的に順次読み取ります。ファイルの最初の部分のみを処理するには、STOPAFTERキーワードを使用します。FILEREADは指定された数のレコードを処理して停止します。その後にファイルを閉じることができます。

ファイルの最初の部分をスキップして残りのレコードを処理するには、STOPAFTERキーワードを使用してフィールド説明を省略します。FILEREADは指定された数のレコードを読み取りますが、データを処理しません。その後に、入力を処理するために、2番目のFILEREAD文をフィールド説明とともに発行します。次のプログラムの抜粋にこの方法を示します。

LIMIT district TO 'Boston'
unit = FILEOPEN('bostdata' READ)
FILEREAD unit STOPAFTER 25
FILEREAD unit WIDTH 8 product SPACE 2 ACROSS month 13 TO 24:-
   WIDTH 4 PACKED sales

ディメンション・メンテナンス

フィールド説明のターゲット・オブジェクトがディメンションである場合、ディメンションに値を追加するためにファイルのデータを使用するかどうかを指定できます。ディメンション属性はMATCHおよびAPPENDです。APPENDによってディメンションに値を追加する場合、APPENDのすぐ後にディメンション位置属性(LASTFIRSTBEFORE posAFTER pos)を指定できます。

形式object=expressionの代入文では、ディメンション属性は、等号の右側に置くことができず、ターゲット・オブジェクトの前に指定する必要があります。例外として、結合ディメンションをメンテナンスする場合など、ディメンションをターゲット・オブジェクトとして右側に置くことがあります。例9-130「ファイル・データによる結合ディメンションのメンテナンス」を参照してください。

ディメンション位置番号

入力データがディメンション値ではなくディメンション位置番号で構成される場合、ディメンションの型がTEXT、ID、DAY、WEEK、MONTH、QUARTERまたはYEARである場合でも、フィールド説明で変換型をINTEGERに指定します。

FILEREAD unit COLUMN 1 WIDTH 8 INTEGER month

入力に位置番号が含まれる場合、TEXT、ID、DAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションに新しい値を追加する際に、APPENDキーワードは使用できません。新しい位置番号には、追加される関連付けられた値がないためです。

結合ディメンション・メンテナンス

結合ディメンションがターゲット・オブジェクトである場合、次の2つの方法のいずれかを使用して値を読み取ることができます。

  • 方法1: 入力にベース・ディメンションの値または位置番号が含まれる場合、次のサンプルの2行に示すように、ディメンション・リストを等号の後に山カッコで囲んで指定する必要があります。

    FILEREAD unit proddist = <COL 1 W 10 product COL 20 -
       W 8 district>
    FILEREAD unit proddist = <COL 1 W 10 INTEGER product COL 20 -
       W 8 INTEGER district>
    

    この例は、proddist連結ディメンションの値を指定するために使用されているproductおよびdistrictディメンションの値を示します。いずれかのディメンションをメンテナンスする必要がある場合には、APPEND属性も使用できます。ただし、productまたはdistrictの値を最初に処理する必要がある場合は、構文で山カッコ内に等号が必要になるため、代替方法を使用する必要があります。(ネストされた等号は許可されません。)この場合、最初にベース・ディメンション値を読み取って処理し、次にフィールド属性を使用せずに、結合ディメンションのディメンション・リストのディメンションを使用します。たとえば、結合ディメンションのベース・ディメンション値を大文字に変換するには、次のような文を使用します。

    FILEREAD unit COL 14 W 8 product = UPCASE(VALUE) -
       COL 5 W 8 district = UPCASE(VALUE) -
       proddist = <product, district>
    
  • 方法2: 入力に結合ディメンションの位置番号が含まれる場合、INTEGERキーワードを指定する必要があります。

    FILEREAD unit INTEGER proddist
    

コンポジットによってディメンション化された変数を伴うFILEREAD

FILEREADは、コンポジットによってディメンション化された変数にデータを読み取る場合、非NA値を割り当てられているターゲット・セルが欠落していると、それを自動的に作成します。この処理によって、その新しいセルに対応するすべてのディメンション値の組合せがコンポジットにも追加されます。したがって、ターゲット・オブジェクトおよびコンポジットは、代入後にサイズが大きくなることがあります。

コンポジットによってディメンション化された変数と効率

FILEREADの自動コンポジット・メンテナンス機能を使用して、コンポジットによってディメンション化された変数にデータをロードする場合、変数のデータにアクセスしようとする際に後で発生する可能性があるパフォーマンスの問題に注意する必要があります。変数のディメンション・リストにおけるコンポジットの位置によって、後でパフォーマンスの問題が発生するかどうかがわかります。

コンポジットが変数の定義におけるディメンション・リストの最後(最も変化の遅い位置)にある場合、ディメンション・リストにコンポジットが含まれない変数に対するのと同じようにFILEREADを使用できます。たとえば、同じFILEREAD文を使用して、次の定義の変数newsalesおよびnewsales.cpにデータを読み取ることができるので、効率が損なわれません。

DEFINE newsales VARIABLE DECIMAL <product district month>
DEFINE newsales.cp VARIABLE DECIMAL <product SPARSE<district month>> 

newsales.cpは、3つのディメンションによってディメンション化されており、そのうち最後の2つのディメンションはコンポジットです。ただし、次の定義のnewsales2.cpのような変数がある場合は、FILEREADによってロードされるデータにアクセスする際のパフォーマンスに影響することがあります。

DEFINE newsales.cp VARIABLE DECIMAL <SPARSE<district month> product > 

この場合、パフォーマンスの問題を回避するために、次に示す2つの方法のいずれかを使用します。

  • FILEREADを使用する前に、CHGDFNをSEGWIDTHキーワードとともに使用して変数のセグメント・サイズを変更します。CHGDFN SEGWIDTHによって変数のセグメントのサイズを指定できます。セグメントは、変数が保持する値の合計数のうちの一部分です。変数内のセグメント数は、データのロード時やデータへのアクセス時のパフォーマンスに影響します。CHGDFN SEGWIDTH文で指定するセグメント・サイズは、varnameで指定する変数に対してのみではなく、同じ組合せのディメンションとコンポジットが同じ順序で定義されているその他すべての変数およびリレーションに対しても使用されます。

  • 結合ディメンションの場合と同じようにコンポジット値を明示的に追加できます。この方法は、名前付きコンポジットと名前のないコンポジットの両方に使用できます。「コンポジット・メンテナンス」を参照してください。

コンポジット・メンテナンス

FILEREADによってコンポジットを明示的にメンテナンスする場合、結合ディメンションのメンテナンスのために使用するのと同じ構文を使用します。コンポジットに名前がない場合、形式SPARSE<dim1 dim2 ...>で指定します。FILEREADによる明示的コンポジット・メンテナンスと自動コンポジット・メンテナンスのそれぞれの利点については、「コンポジットによってディメンション化された変数を伴うFILEREAD」および「コンポジットによってディメンション化された変数と効率」を参照してください。

FILEREADでのDWMQYディメンションの使用方法

フィールドのターゲット・オブジェクトがDAY、WEEK、MONTH、QUARTERまたはYEAR型のディメンションである場合、デフォルトの変換型はVNFです。したがって、入力値がターゲット・ディメンションのVNF(ディメンションのVNFがないときはデフォルトのVNF)に従って書式化されている場合、変換型を指定する必要はありません。

フィールドのターゲット・オブジェクトがDATE変数であるか、DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションである場合、DATEORDERに示す日付として有効な入力スタイルである値は、FILEREADによって正確に解釈されます。DAY、WEEK、MONTH、QUARTERおよびYEAR型のディメンションでは、変換型としてDATEを指定する必要があります。DATE変数の値では、DATEがデフォルトの変換型なのでDATEキーワードはオプションです。

時間ディメンションまたはDATE変数の値が日付を表すINTEGER値(1 = January 1, 1900)である場合も、FILEREADによって正確に解釈されます。この場合、変換型としてRAW DATEを指定する必要があります。

空白のフィールド

フィールドが空白である場合、その値はNAであり、ターゲット変数にNAが代入されます。空白のフィールドの例として、スペースで埋められたテキスト・フィールド、レコードの末尾より後から始まるフィールド、またはフィールド・デリミタ間にスペースも何もない構造化ファイルのフィールドがあります。

FILEREADでのフィールド属性の配置

通常、フィールド属性は、ターゲット・オブジェクトの直前または等号の右側の式の直前に置きます。

     attributes object

ただし、複数のフィールドに属性を適用するには、山カッコで囲んだターゲット・オブジェクトのリストの前に属性を指定します。1つのオブジェクトに適用する複数の属性を含めるには、属性を適用するオブジェクトの前に属性を山カッコで囲んで指定します。

     attributes0 <attributes1 object1=expression object2 attributes3 object3>

山カッコは、結合ディメンション値のベース値を囲む場合にも使用します。

FILEREADでエラーが発生した場合のエラー処理

FILEREADがエラーを検出した場合、エラー・トラップおよび適切な処理によって発生したエラーを制御できます。データを互換性のないデータ型に変換しようとした場合、または無効なディメンション値が検出された場合に、エラーが発生します。FILEERRORファンクションを使用して、エラーの原因に関する詳細を取得できます。エラーを処理した後は、TRAP文を使用してエラー・トラップをオンに戻し、GOTOを使用してFILEREAD文に分岐して戻ります。処理は次のレコードから続行します。例9-128「エラー処理」を参照してください。

NTEXT値を持つターゲット・オブジェクトの指定

構造化ファイルまたはCSVファイルのデータにNTEXT型のターゲット・オブジェクトを指定した場合、FILEREADは値を格納する前に、その値がNTEXTオブジェクトに割り当てられていても、ファイルのデータをデータベース・キャラクタ・セットに変換するため、ファイルのデータがデータベース・キャラクタ・セットで表せない場合にデータが失われることがあります。固定幅の列であるルール化ファイルの場合、FILEREADはデータベース・キャラクタ・セットに変換しないので、データが失われることはありません。

例9-126 ディメンション値とデータ

アナリティック・ワークスペースに6文字の製品識別番号が含まれているとします。製品名および各月の売上数量の値をインポートする必要があります。直近の四半期のデータファイルの形式は、次のとおりです。

Jan951234aa00Chocolate Chip Cookies        123
Jan951099bb00Oatmeal Cookies               145
Jan952355cc00Sugar Cookies                 223
Jan955553ee00Ginger Snap Cookies           233
Feb951234aa00Chocolate Chip Cookies        123
Feb951099bb00Oatmeal Cookies               O145
Feb952355cc00Sugar Cookies                 SS223
Feb955553ee00Ginger Snap Cookies           G233
Mar952355cc00Sugar oCookies                 223
Mar955553ee00Ginger Snap Cookies           233
Mar953222dd00Brownies                      432

ディメンションおよび変数の定義は、次のとおりです。

DEFINE month DIMENSION MONTH
DEFINE productid DIMENSION ID
DEFINE productname VARIABLE TEXT <productid> 
DEFINE units.sold VARIABLE INTEGER <month productid> 

次のプログラムは、FILEREADを使用してmonthおよびproductidの新しい値をアナリティック・ワークスペースに追加し、データを正しい変数に格納します。1つのFILEREAD文でディメンションをメンテナンスしてファイルを閉じ、再びそのファイルを処理して関連付けられたデータを取得します。

DEFINE read.product PROGRAM
PROGRAM
VARIABLE fi INT
fi = FILEOPEN('Dr.Dat' READ)
FILEREAD fi COLUMN 1 APPEND WIDTH 5 month -
   COLUMN 6 APPEND WIDTH 6 productid
FILECLOSE fi
 
fi = FILEOPEN('Dr.Dat' READ)
FILEREAD fi COLUMN 1 WIDTH 5 month -
   COLUMN 6 WIDTH 6 productid -
   COLUMN 12 WIDTH 30 productname -
   COLUMN 44 WIDTH 22 units.sold
FILECLOSE fi
END

例9-127 ディメンション・サロゲート値

この例は、1つのFILEREAD操作でproductディメンションに値を追加し、productディメンションのNUMBERディメンション・サロゲートであるprodnumに値を代入します。2番目のFILEREADでは、monthproductおよびdistrictによってディメンション化されているunits変数に値を代入します。ディメンション値およびサロゲート値のデータファイルの形式は、次のとおりです。

Kiyaks400

次の文は、ファイル・ユニットを定義してファイルを開き、その内容を読み取ってproductディメンションへの値の追加およびprodnumサロゲートへの値の代入を行い、ファイルを閉じます。

DEFINE funit INT
funit = FILEOPEN('Ds.Dat' READ)
FILEREAD funit COL 1 APPEND W 6 product COL 7 ASSIGN W 3 prodnum
FILECLOSE funit

変数値のデータファイルの形式は、次のとおりです。

Jan02400Boston416

次の文は、ファイルを開いてその内容を読み取り、prodnumサロゲートの値との一致を見つけてunits変数に値を代入した後、ファイルを閉じます。

funit = FILEOPEN('Var.Dat' READ)
FILEREAD funit COL 1 W 5 month COL 6 MATCH W 3 prodnum -
  COL 9 W 6 district COL 15 W 3 INTEGER units
FILECLOSE funit

例9-128 エラー処理

書式指定に一致しないデータが入力ファイルにある場合、または、デフォルトのMATCH属性を使用しているときにアナリティック・ワークスペースに含まれないディメンション値が入力ファイルにある場合、エラーが発生します。トラップ・ラベルでエラー処理を使用してエラーの種類をチェックし、不正なレコードをスキップし、ファイルの処理を続行します。FILEPUT文を使用して、不正なレコードを別のファイルに格納することもできます(FILEPUTコマンドを参照)。

次の例では、トラップ・ラベルの文が、ファイルが正常に開かれたか(fil.unitINTEGER値)およびユーザーがプログラムを中断したのかどうかをチェックします。これらのエラーの原因に該当しない場合、プログラムは不正なレコードを検出したと判断し、トラップをリセットしてからFILEREAD文に分岐して戻り、次のレコードの処理を続行します。

DEFINE read.price PROGRAM
PROGRAM
VARIABLE fil.unit INTEGER
TRAP ON ERROR
fil.unit = FILEOPEN( ARG(1) READ)
LIMIT month TO &ARG(2)
NEXT:
FILEREAD fil.unit - 
  WIDTH 8 product -
  WIDTH 4 BINARY price
FILECLOSE fil.unit
RETURN
error:
IF fil.unit EQ NA
  THEN RETURN
IF ERRORNAME NE 'attn' AND ERRORNAME NE 'quit'
  THEN DO
    SHOW JOINCHARS('Record ' RECNO(fil.unit) ' is Invalid.')
    TRAP ON ERROR
    GOTO NEXT
  DOEND
FILECLOSE fil.unit
END

例9-129 アナリティック・ワークスペース・オブジェクトへの割当て前のファイル・データの事前処理

各フィールドのデータをアナリティック・ワークスペースの変数またはディメンションに割り当てる前に、そのデータを処理することもできます。たとえば、データファイルには6桁の数字の製品識別子があり、アナリティック・ワークスペースにはそれと同じ製品番号の値で先頭にPが付くproductディメンションがあるとします。このとき、ファイルの識別子を処理して各値の先頭にPを追加できます。

FILEREAD unit COLUMN 1 WIDTH 6 APPEND LSET 'p' product

例9-130 ファイル・データによる結合ディメンションのメンテナンス

FILEREADによって結合ディメンションをメンテナンスするには、最初にベース・ディメンションをメンテナンスするために入力ファイルの新しい値を追加します。次に、その結果のベース・ディメンション値の組合せを結合ディメンションに割り当てます。次の例は、2つの異なるフィールドからベース・ディメンション値を取得し、その値をベース・ディメンションに追加し、さらに、その組合せを結合ディメンションに追加します。

FILEREAD unit APPEND proddist = <W 8 product, W 8 district>

この文では、山カッコで囲まれていることによって3つのすべてのディメンションにAPPENDが適用されます。ベース・ディメンションには新しい値を追加せずに、新しい結合ディメンション値のみを追加するには、次の2つの文に示すように、キーワードMATCHを明示的に指定するか、ターゲット・オブジェクトの順序を変更します。

fileread unit APPEND proddist = <W 8 MATCH product,W 8 MATCH district>

または

FILEREAD unit W 8 product W 8 district APPEND proddist = <product, district>

例9-131 構造化PRNファイルからのデータの読取り

フィールド2にproductディメンションの値、フィールド3にdistrictディメンションの値、およびフィールド6から始まる複数月の売上値がある構造化PRNファイルからデータを読み取るとします。次の文によって、ファイルの最初の10レコードを読み取ることができます。

FILEREAD unit STOPAFTER 10 STRUCTURED FIELD 2 product -
   district FIELD 6 ACROSS month: sales