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は、入力ファイルのレコードの形式を指定します。次のいずれかを使用します。
attributeは、アクション文によって使用される情報を指定します。
アクション文における属性の配置については、「FILEREADでのフィールド属性の配置」を参照してください。
action-statementsは処理を実行する文で、代入文やIF文などがあります。action-statementは、次のいずれかです。
パラメータ
FILEOPENファンクションを事前にコールすることによって読取り用(READモード)に開かれたファイルに割り当てられるファイル・ユニット番号。
入力ファイルから読み取るレコードの数。STOPAFTERを省略した場合、あるいは負数またはNA
を指定した場合、FILEREADはファイル全体を処理します。「STOPAFTERキーワード」を参照してください。
文字単位またはバイト単位の固定幅の列でレコードが編成されることを指定します。すべての行が同じ形式である必要があります。RULEDはデフォルトのファイル形式です。レコード内のデータの位置を指定するには、COLUMN、SPACEおよびWIDTH属性を使用します。
CSVは、データがCSV(カンマ区切り値)形式であることを指定します。レコード内のデータの位置を指定するには、FIELDおよびSPACE属性を使用します。
dcharは、構造化ファイルでOracle OLAPが標準フィールド・デリミタとして解釈するようにする単一文字を指定するテキスト式です。Oracle OLAPは、標準フィールド・デリミタを使用して数値フィールドおよびテキスト・フィールドを識別します。デフォルト文字はカンマ(,
)です。
CSVファイルは、スプレッドシート・プログラムによって生成される一般的な出力形式です。ソース・ファイルの文字の各行がシングル・レコードとして扱われます。レコードの各フィールドはデフォルトでカンマによって区切られます。フィールド・デリミタとして他の文字を指定するには、DELIMITERキーワードを使用します。
入力レコードの文字のグループが二重引用符で囲まれる場合、次のすべてのルールが適用されます。
そのグループに含まれるデリミタ文字は、デリミタではなくリテラルとして扱われます。
文字のグループに含まれる二重引用符("
)は、その後に別の二重引用符を付ける必要があります。
文字のグループに含まれる改行文字(\n
)は無視されます。
文字のグループを囲む二重引用符の前後にあるスペースまたはタブは無視されます。
レコードが構造化prn形式であることを指定します。レコード内のデータの位置を指定するには、FIELDおよびSPACE属性を使用します。
構造化ファイルは、PCソフトウェア用の一般的な出力形式です。テキスト・ファイルとして、フィールドが文字のグループで構成されます。文字のグループは、二重引用符で囲まれたテキスト、または小数点による以外は中断されない数列の2つの条件によって定義されます。したがって、小数点を含む引用符で囲まれていない数列は単一の値として格納されますが、千の桁を区切るカンマまたはその他のデリミタを含む引用符で囲まれていない数列は、単一の値として格納されずに複数の値に分割されます。引用符で囲まれない数字以外の文字は無視されますが、数字の直前にあるマイナス記号のみは数字の一部とみなされます。マイナス記号と数字の間にスペースを入れても切り離せません。
ファイル形式が前述のパターンに従わない場合、TEXTSTART、TEXTENDおよびDELIMITERキーワードを使用して、各フィールドの先頭および末尾を識別するためにFILEREADが使用するデリミタをカスタマイズできます。
構造化ファイルでOracle OLAPがテキスト・フィールドの先頭として解釈するようにする単一文字を指定します。scharは文字の値です。デフォルト文字は二重引用符("
)です。
構造化ファイルでOracle OLAPがテキスト・フィールドの末尾として解釈するようにする単一文字を指定します。echarrは文字の値です。デフォルト文字は二重引用符("
)です。
構造化ファイルでOracle OLAPが標準フィールド・デリミタとして解釈するようにする単一文字を指定します。Oracle OLAPは、標準フィールド・デリミタを使用して数値フィールドおよびテキスト・フィールドの両方を識別します。dcharは文字の値です。デフォルト文字はカンマ(,
)です。
入力レコードでフィールドが開始する列。デフォルトでは、フィールド1は列1から開始し、それに続くフィールドは前のフィールドの後の列から開始します。現行フィールドのデフォルト列は、前のフィールドの最初の列、前のフィールドの幅、および現行フィールドに指定されるスペースの合計です。
表9-7 ファイル属性
構文 | 説明 |
---|---|
{COLUMN|COL} n |
入力レコードでフィールドが開始する列。デフォルトでは、フィールド1は列1から開始し、それに続くフィールドは前のフィールドの後の列から開始します。現行フィールドのデフォルト列は、前のフィールドの最初の列、前のフィールドの幅、および現行フィールドに指定されるスペースの合計です。 |
{SPACE|SP} n |
フィールドと前のフィールドの間のスペースの数。構造化PRNファイルでは、前のフィールドと現行フィールドの間のフィールドの数。デフォルトは |
{FIELD|FLD} n |
構造化PRNファイルの場合のみ、データの抽出元のフィールド。 |
{WIDTH|W} n |
構造化されていないレコードの場合に、入力レコードでフィールドが占有する列の数。デフォルトがない場合、ルール化レコードにはWIDTHを含める必要があり、含めないとFILEREADはエラーを生成する。デフォルトは、次に示すようにデータ型から導出される。
最大幅はテキスト入力で4,000文字。 |
data-type |
使用できるキーワードは、INTEGER、SHORTINTEGER、DECIMAL、SHORTDECIMAL、NUMBER、TEXT、ID、DATE、VNF、RAW DATE、BOOLEAN。
|
dimension-value-handling |
ターゲット・オブジェクトがディメンションまたはディメンション・サロゲートである場合に、新しい値をターゲット・オブジェクトに追加するかどうかを指定する次のいずれかのキーワード句。
|
input-field-format |
入力フィールドの形式を指定する次のいずれかのキーワード。
|
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を削除するかどうかを指定する次のいずれかのキーワードを指定する。
|
バイナリまたはパック入力の場合、入力が指定された数値であるときにNA
がターゲット・オブジェクトに割り当てられることを指定します。
テキスト入力の場合に、Oracle OLAPがテキストをNAとして格納することを指定します。入力が指定されたテキストである場合、NAがターゲット・オブジェクトに割り当てられます。テキストは、複数のNA値を取れる複数行の文字列にできます。テキストに指定される値の他に、入力がNAである場合はNAがターゲット・オブジェクトに割り当てられます。
テキストの数値入力の場合に、Oracle OLAPがテキストを0として格納することを指定します。入力が指定されたテキストである場合、ゼロがターゲット・オブジェクトに割り当てられます。テキストは、複数のゼロ値を取れる複数行の文字列にできます。テキストに指定される値の他に、入力が0
である場合は0
がターゲット・オブジェクトに割り当てられます。
テキスト入力がBOOLEANである場合に、Oracle OLAPがテキストをYESとして格納することを指定します。入力がテキストである場合、YESがターゲット・オブジェクトに割り当てられます。テキストは、複数のYES値を取れる複数行の文字列にできます。textに指定される値の他に、入力がYES
、ONまたはTRUEである場合はYES
がターゲット・オブジェクトに割り当てられます。
テキスト入力がBOOLEANである場合に、Oracle OLAPがテキストをNOとして格納することを指定します。入力がテキストである場合、NOがターゲット・オブジェクトに割り当てられます。テキストは、複数のNO値を取れる複数行の文字列にできます。'text'に指定される値の他に、入力がNO、OFFまたはFALSEである場合はNOがターゲット・オブジェクトに割り当てられます。
テキストの数値入力の場合に、Oracle OLAPが結果のテキストのスペースをゼロで埋めることを指定します。入力のスペースがゼロで置き換えられます。デフォルトはゼロによる埋込みを行いません。
入力ファイルからレコードが読み取られるたびに実行するアクション文を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内で実行する際には無視されます。 |
代入文によって、Oracle OLAPオブジェクトに値を代入できます。代入文の形式は次のとおりです。
object [= expression]
objectは、データを代入して格納するターゲットです。objectには、Oracle OLAP変数、ディメンション、ディメンション・サロゲート、コンポジットまたはリレーションを指定できます。
expressionは、ターゲットに代入されるデータ値のソースです。
重要: SQL FETCHまたはSQL IMPORT代入文では、expression構成要素はオプションではありません。ただし、FILEREAD代入文はオブジェクト名のみで構成できます。その場合、入力データはobjectに直接代入されます。FILEREAD代入文のexpressionにはVALUEキーワードを含めることができます。 |
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文によって、式の値に基づいてアクションを実行できます。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文では、後に続くアクション文が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-statement1 -
[action-statement2 . . .]>
アクション文のグループが使用されるのは、通常、ACROSS文の後です。山カッコの構文によって、ACROSSディメンションのステータスにあるすべての値に対して複数のアクション文を実行できます。
使用上の注意
一度に1つのレコードの読取り
FILEREADのかわりとして、レコードのフィールドを処理する1つ以上のFILEVIEW文とともに、一度に1つのレコードを読み取るFILENEXTファンクションを使用できます。
フィールド順序
入力レコードにディメンション値と変数データの両方が含まれる場合、ディメンション値はレコードで最初に読み取られるフィールドである必要があり、変数データ値はそのディメンション値の後に読み取られる必要があります。これに従うためには、入力レコードのフィールド自体を並べ替えるか、FILEREAD属性を使用してフィールド位置を明示的に指定します。(attribute引数の説明を参照してください。)
FILEREADで位置属性を使用する必要がないように入力レコードを編成するには、すべてのディメンション値をレコードの最初のフィールドに入れ、変数データ値をレコードの最後のフィールドに入れます。たとえば、同じディメンションを同じ順序(time
、product
および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のすぐ後にディメンション位置属性(LAST
、FIRST
、BEFORE
pos
、AFTER
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では、month
、product
および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.unit
はINTEGER
値)およびユーザーがプログラムを中断したのかどうかをチェックします。これらのエラーの原因に該当しない場合、プログラムは不正なレコードを検出したと判断し、トラップをリセットしてから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>