9.230 TRANSFORM_FILE
ディスク・ファイルの現在の内容を1つ以上の作業リストに変換します。
この組み込み関数は、Visual LANSAアプリケーションとスプレッドシートなどのその他の製品との間で情報を簡単に転送できるようにするためのものです。
注:この組み込み関数は、テキスト・データ・ファイルのみを操作するよう設計されています。
各製品の対応
LANSA/AD |
使用可 |
RDMLX のみで使用可能 |
Visual LANSA for Windows |
使用可 |
|
Visual LANSA for Linux |
使用可 |
引数
番号 |
タイプ |
必須/任意 |
記述 |
最小長 |
最大長 |
最小小数桁数 |
最大小数桁数 |
---|---|---|---|---|---|---|---|
1 |
L |
必須 |
変換されたファイル・データを受け取る1次作業リストの名前 |
||||
2 |
A |
必須 |
入力データを含んでいるファイルの名前 |
1 |
256 |
||
3 |
A |
任意 |
入力ファイルの形式 A = 通常の区切りファイル B = DBFファイル(IBM iでは使用不可) C = 列ファイル(符号あり) D = 列ファイル(符号なし) O = コンマ区切りファイル T = 水平タブ区切り デフォルトは、Aです。 次の特殊なテスト・オプションも使用することができます。このオプションは、テストとデバッグの目的にのみ使用し、本番のソフトウェアでは使用しないでください。 CL = 予期される列ファイル(符号あり)のレイアウト DL = 予期される列ファイル(符号なし)のレイアウト 入力ファイルの形式がA、C、D、O、T、CLおよびDLである場合、UTF-8形式をサポートします。これにより、引数(つまり、形式)の2列目に'U'が置かれることになります。例えば、UTF-8入力を形式Aでした場合、入力ファイルの形式は'AU'になります。形式CLの場合は、'CUL'になります。 |
1 |
3 |
||
4 |
A |
任意 |
英数字フィールドに検出された無効な文字の処理方法 B = ブランク文字で置き換える I = 無視する。文字は含んだままにする R = 入力から削除する デフォルトはBです。 |
1 |
1 |
||
5 |
A |
任意 |
復帰(CR)の予期 N = 復帰(CR)を予期しない T = 打ち切られた行をブランクで埋められている行として処理する Y = 復帰(CR)を予期する デフォルトは、Yです。 |
1 |
1 |
||
6 |
A |
任意 |
予期される小数点。使用できる値は、以下のとおりです。 R = 小数点は存在しないため、ロードされるフィールドの定義から暗黙指定される必要があります。ファイル形式CとDに対してのみ有効です。 その他 - 小数点文字として予期される値 デフォルトは、現在システムで定義されている小数点(つまり、'.'または',')です。 注:ヨーロッパ形式の','小数点を使用すると、フィールドを区切るためにコンマを使用するファイル形式で問題が発生する可能性があります。 |
1 |
1 |
||
7 |
A |
任意 |
入力ファイルのクローズ・オプション Y = 完了時にファイルを閉じる N = ファイルの終わりに到達していない場合、完了時にファイルを閉じない デフォルトはYです。 |
1 |
1 |
||
8 |
A |
任意 |
レコード選択オプション N = 比較の必要なし EQ = 等しい GT = より大きい GE = より大きいか等しい LT = より小さい LE = より小さいか等しい NE = 等しくない デフォルトはNです。 入力ファイルのタイプがBの場合、このオプションを使用することはできません。 |
1 |
20 |
||
9 |
N |
任意 |
レコード選択オプション デフォルトは1です。 引数番号8がNに指定されている場合、この引数は無視されます。 |
1 |
制限なし |
0 |
0 |
10 |
u |
任意 |
レコード選択の比較値。レコードは、入力バッファーから読み込まれるとき、(指定の位置で)この値と比較されます。値が保持されているフィールドの長さ分のバイト数が比較されます。 比較が真の場合、レコードは処理されます。偽の場合、レコードはスキップされます。フィールドの全長とその現在の大文字/小文字を使用して、フィールドの現在の値が比較されます。引数番号8がNに指定されている場合、この引数は無視されます。 デフォルトはありません。*DEFAULTを指定した場合、比較は行われません。 |
1 |
256 |
||
11 - 20 |
L |
任意 |
最大10個の「付属」の作業リストを指定することができます。詳細については、以下の「技術上の注記」を参照してください。 1 次作業リストがRDMLリストの場合のみ有効です。 |
戻り値
番号 |
タイプ |
必須/任意 |
記述 |
最小長 |
最大長 |
最小小数桁数 |
最大小数桁数 |
---|---|---|---|---|---|---|---|
1 |
A |
必須 |
戻りコード EF -
ファイルはリストに変換された。リストがオーバーフローする前に入力ファイルの終わりに到達した |
2 |
2 |
技術上の注記 - TRANSFORM_FILE
ファイル名
詳細については、「TRANSFORM_LIST」の「出力ファイル形式」を参照してください。
入力ファイルの形式
詳細については、「TRANSFORM_LIST」の「出力ファイル形式」を参照してください。
特殊なオプションCLとDLは、テストとデバッグの目的にのみ使用することができます。このオプションを本番のソフトウェアでは使用しないでください。使用した場合、このオプションによって指定のリストは読み取られません。代わりに、レイアウトの詳細が準備され、入力ファイルの予期されるレアウトが、ファイル・パラメータで指定されたファイルに実際に書き込まれます。指定のファイルが存在しない場合、ファイルが作成されます。指定のファイルが存在する場合、そのファイル内の既存のデータがすべて消去されてから、レイアウトの詳細が書き込まれます。レイアウト・ファイルは生成されると、標準のテキスト・エディターで表示することができます。この情報によって、実際の入力データ・ファイルのレコード・レイアウトとこの組み込み関数が予期するレイアウトを比較することができます。このような比較によって、フォーマットに関する問題を見つけることができます。
Alpha、Char、String、BLOB、CLOBフィールドでの無効文字の処理
TRANSFORM_LISTの「出力ファイル形式」に記載されている「Alpha、Char、String、BLOB、CLOB フィールドでの無効文字の処理」を参照してください。同じルールが適用されますが、適用されるのは、出力ファイルのフィールドに対してではなく、作業リストのフィールドです。
一部の特殊文字は、この組み込み関数で正しく処理できません。このような特殊文字として、復帰(Windowsでのバイナリー値:0x0D)、ライン・フィード(Windowsでのバイナリー値:0x0A)、CTRL+Z (Windowsでのバイナリー値0x1A)があります。例えば、TRANSFORM_FILEは、Windows環境で'0x1A'文字を検出すると、読み取りを停止します。
TRANSFORM_LISTによってバイナリー・データをファイルに出力するには、組み込み関数BINTOHEXを使用して英数字文字列に変換してから、結果をTRANSFORM_LISTで出力する方法が最善です。
データを取得するには、TRANSFORM_FILEを使用してデータを読み取ってから、HEXTOBINを使用してデータを元の形式に変換して戻します。
小数点文字
通常、このオプションは、コンマ(,)を小数点区切り文字として使用するようシステムを構成しているヨーロッパの一部の国で要求されます。デフォルトでは、組み込み関数はコンマを予期します。コンマを生成しない他の製品によってデータ出力が使用される場合、これが適切でない場合があります。このオプションを使用して、この組み込み関数がピリオド文字(.)を予期するように指定することができます。
また、固定レコード形式と「暗黙指定(位置による)」される小数点を使用するアプリケーションによって読み取りファイルが作成される場合、特殊なオプションR(削除)を使用することができます。この場合、小数点位置の番号は、作業リストで受け取るフィールドの定義によって暗黙指定されます。詳細については、TRANSFORM_LISTを参照してください。
Rオプションは、ファイル形式がCとDの場合のみ使用することができます。
入力ファイルのクローズ・オプション
このオプションを使用すると、この組み込み関数が実行を完了したときにファイルの終わりに到達していない場合は、入力ファイルを閉じないように指定することができます。
通常、この組み込み関数は、呼び出されると、リストをクリアします。その後、リストに収まる量のデータをロードし、入力ファイルを閉じ、呼び出し元のファンクションに制御を戻します。戻りコードは、EFまたはOVに設定され、入力ファイル全体がリストに収まったかどうかが示されます。
ただし、閉じないオプションを使用することによって、次のようにより複雑な処理を実行することができます。
レコードが10,000個以上ある入力ファイルを読み取る、または大量の割り当てメモリーを必要とする大きな作業リストが作成されないようにする
def_list #list fields(....) listcount(#count)
type(*working) entrys(100)
dowhile (#retcode *ne EF)
use TRANSFORM_FILE into #list (with "do
not close" option)
execute processlist
endwhile
execute processlist
上記の例では、使用されるリストが100エントリーが効率的に収まるサイズであっても、入力ファイルからレコードを何個でも読み取ります。リストは、アプリケーションの入力バッファーの役割を果たします。
このオプションとこの組み込み関数を使用するためのヒントを説明します。
· この組み込み関数は、Visual LANSAアプリケーションと外部アプリケーションとの間のインターフェースとなることを目的に作成されました。この組み込み関数は、ファイルを開き、そのファイルからデータを読み取り、最後にファイルを閉じるために使用します。「常に開いている」ポーリング・ファイルの保守など、複雑な「システム」レベルのタスクに使用するためのものではありません。
· 最大50個の入力ファイルを同時に開くことができます。お使いのオペレーティング・システムによっては、これより少ない制限または構成オプションが使用される場合があります。
· 最大レコード長に対する制限はありません。各レコードの最後に、改行(NL)文字がレコードの終わりを示す区切り文字として追加されます。
· 開いたままオプションを使用する場合、必ず、EFが戻されるまでこの組み込み関数を継続するようにしてください。つまり、入力ファイルが閉じられてしまいます。
· この組み込み関数は、呼び出されるたびにすべての引数をチェックし、現在開いている入力ファイルのリストで一致するデータを検索します。このため、最も効率的なのは、多数のエントリーを追加できるリストを使用して、数回呼び出す場合です。少数のエントリーしか追加できないリストを使用して、何度も呼び出すことは、効率的ではありません。
レコード選択機能
入力ファイルのタイプがBの場合、使用できません。
引数8、9、10を指定することによって、簡単なレコード選択ロジックを実行することができます。引数8にN以外の有効な値を渡すことによって、このオプションが有効になった場合、ファイルから各<record>が読み取られ、次の式が評価されます。
if (substring(<record>,<position>,<length>) <operation> <value>)
表記の説明:
· <record>は、現在のレコードです。
· <position>は、引数9の位置です。
· <length>は、引数10のフィールドの長さです。この<length>は、256バイト以下でなければなりません。
· <operation>は、引数8の演算です。
· <value>は、引数10のフィールドの値です。
式が真の場合、レコードは選択されます。式が偽の場合、レコードは無視されます。
この比較は、データ処理の前に行われます。
これは、フィールド指向の演算ではなく、バイト指向の演算です。
レコード選択オプションと共にファイルを使用する場合、固定長列ファイル(TRANSFORM_LISTのCまたはD)を使用することをお勧めします。また、<position>が可変長フィールドの前に現れるように、すべての可変長フィールドをレコードの後方に移動することをお勧めします。この目的は、入力バッファー内の<position>で始まる <length> バイトの部分が、すべてのレコードに対して同じ意味を持つようにすることです。また、<position> + <length>がレコード内のバイト数より大きい場合、TRANSFORM_FILEは、致命的なエラー「比較に無効な引数」を戻し、停止します。
入力ファイルのタイプがA、O、またはTの場合、比較されるデータの前に現れる暗黙指定の文字は、<position>計算で計算される必要があります。
例えば、以下のようになります。
Aタイプのファイルが、2つのAlphaフィールドを持つリストから生成されるとします。フィールドは両方とも9バイトの長さです。エントリーのフィールドは、常にフル(最大長まで埋まっている)です。データに無効な文字はありません。比較は、2番目のフィールドの最初のバイトから行われます。したがって、<position>は、次のように計算される必要があります。
<position> = 1(最初のフィールドの左二重引用符) + 9 (最初のフィールドの長さ) +
1 (右二重引用符) + 1 (カンマ) + 1 (2番目のフィールドの左二重引用符) + 1 (<position>は1から開始) =
14
出力ファイルのタイプがC またはDの場合、<position>は次のように計算されます。
<position> = 9 (最初のフィールドの長さ) + 1
(<position>は1から開始) = 10
レコードがある理由、もしくはない理由を確認したい場合、レベル9、'BIF'カテゴリーへのトレースを有効にしてください。トレース・ファイルは利用されている比較パラメータと比較パラメータと一致しないデータをリストにします。トレースはUnicode形式ではないため、Notepadのような Unicode対応のプログラムを使用している場合、判読可能なデータが表示されないことに注意してください。
付属リスト
この組み込み関数を呼び出すとき、最大10個の付属作業リストを指定することができます。付属リストは、入力ファイルが100を超えるフィールドを含んでいる場合、またはリストの合計エントリー長が256バイトを超える場合に使用することができます。
付属リストの詳細については、TRANSFORM_LIST組み込み関数を参照してください。「付属オプション」フィールドの概念は、この組み込み関数には関係ありません。付属リストに定義されるフィールドはすべて、1次リスト(引数1)を論理的に拡張したものとして処理されます。付属作業リストの最大エントリー数は、1次リストに許可された数と同じにする必要があります。
エラー処理とエラー動作
次の表に、ER戻りコードが戻され、RDMLレベルでトラップすることができるエラー(ユーザー・トラップ)とアプリケーションの致命的な障害を引き起こすエラー(システム・エラー)を示します。システム・エラーが発生すると、Visual LANSAの完全なエラー処理が呼び出され、X_RUN「セッション」全体が終了します。通常、システム・エラーをRDMLレベルでトラップすることはできません。
エラーのタイプ |
エラー状況 |
---|---|
開こうとする入力ファイルが多すぎた |
システム・エラー |
入力ファイル・オプションに、A、T、C、D、B、O以外を指定した |
システム・エラー |
無効な文字のオプションに、I、B、R以外を指定した |
システム・エラー |
復帰(CR)制御のオプションに、Y、N、T以外を指定した |
システム・エラー |
ファイル・クローズ・オプションに、Y、N以外を指定した |
システム・エラー |
付属リストに、無効な最大エントリー値がある |
システム・エラー |
入力ファイルを開くときにエラーが発生した |
ユーザー・トラップ |
入力ファイルから読み取るときにエラーが発生した |
システム・エラー |
入力ファイルに正しくないまたは予期しないデータが存在する |
システム・エラー |
エラー処理の注記
複雑なエラー処理スキームをご使用のアプリケーションに組み込むことは避けるよう、強くお勧めします。アプリケーションのすべてのレベルで、以下のようなごく単純なトラップを使用するようにしてください。
if (#retcode *ne OK)
abort msgtxt('Failed to .............................')
endif
標準的なエラー処理を行う組み込み関数を生成されるアプリケーションに組み入れて、問題に対処するようにしてください。ユーザー定義のエラー処理ロジックが非常に複雑になったために全RDMLコードの40から50%を占有するようなケースもあります(アプリケーションには何のメリットもありません)。このような事態に陥らないようにしてください。
特別注記
結果リストのBLOB、CLOBフィールド値
BLOB(またはCLOB)フィールドは、ファイル名だけを保持します。ファイル名の値が<ドライブ>:\ <パス>\<ファイル>.<接尾辞>の場合、BLOB (またはCLOB)ファイル自体は、サブディレクトリ<ドライブ>:\ <パス>\<ファイル>_LOB\にあります。
例えば、以下のようになります。
変換されたファイルからBLOB値BLOBNumber1.txtを取得するには、次を使用します。
C:\Root\Data\Transformed1.dat
この場合、BLOBファイルは以下の場所に存在しなければなりません。
C:\Root\Data\Transformed1_LOB\BLOBNumber1.txt
変換されたファイルがTRANSFORM_LISTによって作成されていない場合、BLOB(またはCLOB)ファイルを複製する必要はありません。この場合、BLOB(またはCLOB)の値には、フル・パスを入れる必要があります。
例えば、BLOBNumber1.txtというBLOBファイルがC:\Data\にあり、このBLOBファイルを複製しない場合、変換されたファイルのBLOBフィールドの値は、C:\Data\BLOBNumber1.txtでなければなりません。
例
TRANSFORM_LISTを参照してください。