InterSystems IRIS® Data Platform の ObjectScript は、それぞれ独自の目的と機能に合わせて文字列に関連する演算グループを提供します。これらは、基本的な文字列演算と関数、区切り文字列演算、およびリスト構造文字列演算です。
区切り文字列演算
InterSystems IRIS には、文字列を部分文字列として処理できる機能があります。この機能により、データの一部分を 1 つの完全なデータとして格納する処理が可能です。以下はその関数です。
$PIECE 関数独自の重要な機能として、専用の区切り文字 (例えば “^”) で区切って記述した複数の部分文字列を単一の文字列として使用できます。長い文字列はレコードとして、部分文字列はそのフィールドとして動作します。
$PIECE の構文は以下のとおりです。
WRITE $PIECE("ListString","QuotedDelimiter",ItemNumber)
ListString は使用されている完全なレコードを含む、引用符で囲まれた文字列です。QuotedDelimiter は指定の区切り文字で、引用符内に記述する必要があります。 ItemNumber は、返されるように指定された部分文字列です。例えば以下の構文で、スペースで区切られた以下のリストで 2 番目のアイテムを表示します。
WRITE $PIECE("Kennedy Johnson Nixon"," ",2)
これは、“Johnson” を返します。
また、リストから複数の値を返すこともできます。以下はその構文です。
WRITE $PIECE("Nixon***Ford***Carter***Reagan","***",1,3)
これは、“Nixon***Ford***Carter” を返します。この値は、実際の部分文字列を参照する必要があります。また、3 番目の引数 (ここでは 1) は、4 番目の引数 (ここでは 3) よりも小さい値になる必要があることに注意してください。
以下のリストのように、区切り文字は任意に決めることができます。
SET x = $PIECE("Reagan,Bush,Clinton,Bush,Obama",",",3)
SET y = $PIECE("Reagan,Bush,Clinton,Bush,Obama","Bush",2)
WRITE x,!,y
これは、以下を返します。
Clinton
,Clinton,
最初のコードの区切り文字はコンマです。2 番目は、文字列 “Bush” が区切り文字であるため、返される文字列はコンマを含みます。区切り文字を正確に理解するために、次のセクションではリストに関連する関数を説明しています。
高度な $PIECE 関数
要素値を区切ってリストに記述する $PIECE を呼び出すことで、リストの中で固有の項目に部分文字列を配置し、他の部分は空として、十分な数の項目をリストに追加できます。例えば、あるコードで、リストの 1 番目、4 番目、そして 20 番目に項目を設定するとします。
SET $PIECE(Alphalist, "^", 1) = "a"
WRITE "First, the length of the list is ",$LENGTH(Alphalist,"^"),".",!
SET $PIECE(Alphalist, "^", 4) = "d"
WRITE "Then, the length of the list is ",$LENGTH(Alphalist,"^"),".",!
SET $PIECE(Alphalist, "^", 20) = "t"
WRITE "Finally, the length of the list is ",$LENGTH(Alphalist,"^"),".",!
この $LENGTH 関数は、1、4、20 の値を順番に返します。その長さに相当する必要な数のアイテムが、このコードで作成されているからです。ただし、アイテム 2、3、そして 5 から 19 には、値が設定されていません。そのため、これらの値を表示させようとしても、何も表示されません。
区切り文字列アイテムは、区切り文字列も含むことができます。このようなサブリストから値を取得するには、以下のように $PIECE 関数の呼び出しを入れ子にします。
SET $PIECE(Powers, "^", 1) = "1::1::1::1::1"
SET $PIECE(Powers, "^", 2) = "2::4::8::16::32"
SET $PIECE(Powers, "^", 3) = "3::9::27::81::243"
WRITE Powers,!
WRITE $PIECE( $PIECE(Powers, "^", 2), "::", 3)
このコードは 2 行の出力を返します。1 行目は文字列 Powers で、すべての区切り文字を含みます。2 行目は 8 で、これは Powers の 2 番目の要素に含まれるサブリストの 3 番目の要素の値です。 (Powers リストで、n 番目のアイテムは、2 を 1 乗から 5 乗までしたサブリストです。したがって、例えばサブリストの最初のアイテムは、n の 1 乗となります)。
詳細は、"ObjectScript リファレンス" で "$PIECE" のリファレンス・ページを参照してください。
リスト構造文字列演算
ObjectScript は、“リスト” という特別な文字列の種類を定義します。これは、要素と呼ぶ部分文字列のエンコード・リストから構成されます。これらの InterSystems IRIS リストは、以下のリスト関数のみを使用して処理できます。
-
リスト作成 :
-
$LISTBUILD は、パラメータ値として各要素を指定することでリストを作成します。
-
$LISTFROMSTRING は、デリミタを含む文字列を指定することでリストを作成します。この関数はデリミタを使用して、文字列を要素に分割します。
-
$LIST は、既存のリストからその一部を抽出してリストを作成します。
-
リスト・データ取得 :
-
$LIST は、リスト要素の値をその位置別に返します。リストの先頭または末尾から位置をカウントできます。
-
$LISTNEXT は、リストの先頭から順番にリスト要素の値を返します。$LIST および $LISTNEXT はともにリストから要素を順番に返すために使用されますが、大量のリスト要素を返す場合は、$LISTNEXT の方が大幅に高速な処理が可能です。
-
$LISTGET は、リスト要素の値を位置別に返すか、または既定値を返します。
-
$LISTTOSTRING は、リストの要素の値すべてを区切り文字列として返します。
-
リストの操作 :
-
リストの評価: :
リストはエンコードされた文字列であるため、InterSystems IRIS ではリストの扱いが標準の文字列の場合とは多少異なります。したがって、リストでは標準の文字列関数を使用しないようにします。さらに、ほとんどのリスト関数は、標準の文字列で使用すると <LIST> エラーを発生します。
以下のプロシージャは、さまざまなリスト関数の使用法を示しています。
ListTest() PUBLIC {
// set values for list elements
SET Addr="One Memorial Drive"
SET City="Cambridge"
SET State="MA"
SET Zip="02142"
// create list
SET Mail = $LISTBUILD(Addr,City,State,Zip)
// get user input
READ "Enter a string: ",input,!,!
// if user input is part of the list, print the list's content
IF $LISTFIND(Mail,input) {
FOR i=1:1:$LISTLENGTH(Mail) {
WRITE $LIST(Mail,i),!
}
}
}
このプロシージャは、リストの重要な機能を示しています。
リスト関数の詳細は、"ObjectScript リファレンス" の関連リファレンス・ページを参照してください。
スパース・リストおよびサブリスト
リストの指定された位置に要素値を追加する関数では、適正位置に値を配置するために十分な数のリスト要素を追加します。以下はその例です。
SET $LIST(Alphalist,1)="a"
SET $LIST(Alphalist,20)="t"
WRITE $LISTLENGTH(Alphalist)
この例にある 2 番目の $LIST で 20 番目のリスト要素を作成しているので、$LISTLENGTH は値 20 を返しますが、2 ~ 19 番目の要素には値が設定されていません。そのため、これらの値を表示させようとすると、<NULL VALUE> エラーが発生します。$LISTGET を使用して、このエラーを回避できます。
List の要素自体をリストとすることもできます。このようなサブリストから値を取得するには、以下のように $LIST 関数呼び出しを入れ子にします。
SET $LIST(Powers,2)=$LISTBUILD(2,4,8,16,32)
WRITE $LIST($LIST(Powers,2),5)
このコードは、Powers リストの 2 番目の要素に含まれるサブリストの 5 番目の要素値、32 を返します。(Powers リストで 2 番目のアイテムは、2 を 1 乗から 5 乗までしたサブリストです。したがって、例えばサブリストの最初のアイテムは、2 の 1 乗になります)。