Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

文字列演算

ObjectScript は、それぞれ独自の目的と機能に合わせて文字列に関連する演算グループを提供します。以下のとおりです。

基本的な文字列演算と関数

ObjectScript の基本的な文字列演算では、文字列でさまざまな処理を実行できます。その処理は、以下のとおりです。

  • $LENGTH 関数は、文字列の文字数を返します。以下はそのコードの例です。

     WRITE $LENGTH("How long is this?")

    これは、文字列の長さ、17 を返します。詳細は、"Caché ObjectScript リファレンス" で "$LENGTH" のリファレンス・ページを参照してください。

  • $JUSTIFY は、文字列の左側をスペース文字で埋め、右揃えした文字列を返します (数値演算も実行できます)。以下はコードの例です。

     WRITE "one",!,$JUSTIFY("two",8),!,"three"

    これは、文字列 “two” の位置を 8 文字に調整し、返します。

    one
         two
    three
    

    詳細は、"Caché ObjectScript リファレンス" で "$JUSTIFY" のリファレンス・ページを参照してください。

  • $ZCONVERT は、文字列の形式を変換します。大文字と小文字の変換 (大文字変換、小文字変換、タイトル文字変換など) とコード変換 (さまざまな形式でコード化された文字間の変換) をサポートします。以下はコードの例です。

     WRITE $ZCONVERT("cRAZy cAPs","t")

    これは、以下を返します。

    CRAZY CAPS
    

    詳細は、"Caché ObjectScript リファレンス" で "$ZCONVERT" のリファレンス・ページを参照してください。

  • $FIND 関数は、文字列を部分文字列で検索し、その部分文字列の次にある文字の位置を返します。以下はコードの例です。

     WRITE $FIND("Once upon a time...", "upon")

    これは、“upon” の直後の文字位置である 10 を返します。詳細は、"Caché ObjectScript リファレンス" で "$FIND" のリファレンス・ページを参照してください。

  • $TRANSLATE 関数は、文字列内で文字単位の置換を行います。以下はコードの例です。

     SET text = "11/04/2008"
     WRITE $TRANSLATE(text,"/","-")

    これは、日付のスラッシュをハイフンに置き換えます。詳細は、"Caché ObjectScript リファレンス" で "$TRANSLATE" のリファレンス・ページを参照してください。

  • $REPLACE 関数は、文字列内で文字列単位の置換を行います。演算の対象とする文字列の値は変更しません。以下はコードの例です。

     SET text = "green leaves, brown leaves"
     WRITE text,!
     WRITE $REPLACE(text,"leaves","eyes"),!
     WRITE $REPLACE(text,"leaves","hair",15),!
     WRITE text,!

    これは、2 つの異なる処理を行います。最初の呼び出しの $REPLACE では、文字列 leaves を文字列 eyes に置き換えます。2 番目の呼び出しの $REPLACE では、(4 番目の引数で指定された位置である) 15 番目の文字の前にあるすべての文字を破棄し、文字列 leaves を文字列 hair に置き換えます。text 文字列の値は、どの $REPLACE 呼び出しでも変更されません。詳細は、"Caché ObjectScript リファレンス" で "$REPLACE" のリファレンス・ページを参照してください。

  • $EXTRACT 関数は、文字列の中で指定の位置から部分文字列を返します。以下はコードの例です。

     WRITE $EXTRACT("Nevermore"),$EXTRACT("prediction",5),$EXTRACT("xon/xoff",1,3)

    これは、3 つの文字列を返します。1-引数形式は文字列の最初の文字、2-引数形式は文字列から指定された文字、3-引数形式は指定の文字から始まり指定の文字で終わる部分文字列をそれぞれ返します。ここでは改行がないため、以下の値を返します。

    Nixon
    

    詳細は、次のセクションまたは "Caché ObjectScript リファレンス" で "$EXTRACT" のリファレンス・ページを参照してください。

$EXTRACT の高度な機能

$EXTRACT 関数と SET コマンドを組み合わせて使用することで、文字列の左側をスペースで埋めることができます。

 SET x = "abc"
 WRITE x,!
 SET $EXTRACT(y, 3) = x
 SET x = y
 WRITE x

このコードは、文字列 “abc” を取得し、文字列y の 3 番目に置きます。y には値が指定されていないので、$EXTRACT では、文字列に対する埋め込み文字として機能する空白と見なされます。

$EXTRACT を使用して、変数の特定位置に新たな文字列を挿入することもできます。新、旧文字列の長さが同じかどうかにかかわらず、指定の文字を抜き出し、そこに提供された部分文字列を置きます。例えば以下のようになります。

 SET x = "1234"
 WRITE x,!
 SET $EXTRACT(x, 3) = "abc"
 WRITE x,!
 SET $EXTRACT(y, 3) = "abc"
 WRITE y

このコードは、x の値として “1234” を設定します。次に $EXTRACT を使用して、x の 3 番目の文字を抜き出し、その位置に “abc” を挿入します。その結果、文字列 “12abc4” が作成されます。

区切り文字列演算

Caché には、文字列を部分文字列として処理できる機能があります。この機能により、データの一部分を 1 つの完全なデータとして格納する処理が可能です。以下はその関数です。

  • $PIECE — 指定の区切り文字に基づいて文字列内の特定の部分を返します。その範囲や、複数の区切り文字を元に、1 つの文字列から複数の個所を返すこともできます。

  • $LENGTH — 指定の区切り文字に基づいて 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 乗となります)。

詳細は、"Caché ObjectScript リファレンス" で "$PIECE" のリファレンス・ページを参照してください。

リスト構造文字列演算

ObjectScript は、“リスト” という特別な文字列の種類を定義します。これは、要素と呼ぶ部分文字列のエンコード・リストから構成されます。これらの Caché リストは、以下のリスト関数のみを使用して処理できます。

  • リスト作成 :

    • $LISTBUILD は、パラメータ値として各要素を指定することでリストを作成します。

    • $LISTFROMSTRING は、デリミタを含む文字列を指定することでリストを作成します。この関数はデリミタを使用して、文字列を要素に分割します。

    • $LIST は、既存のリストからその一部を抽出してリストを作成します。

  • リスト・データ取得 :

    • $LIST は、リスト要素の値をその位置別に返します。リストの先頭または末尾から位置をカウントできます。

    • $LISTNEXT は、リストの先頭から順番にリスト要素の値を返します。$LIST および $LISTNEXT はともにリストから要素を順番に返すために使用されますが、大量のリスト要素を返す場合は、$LISTNEXT の方が大幅に高速な処理が可能です。

    • $LISTGET は、リスト要素の値を位置別に返すか、または既定値を返します。

    • $LISTTOSTRING は、リストの要素の値すべてを区切り文字列として返します。

  • リストの操作 :

    • SET $LIST は、リストの要素を挿入、更新、または削除します。SET $LIST は、リストの要素または要素の範囲を 1 つ以上の値で置換します。SET $LIST はリストの要素を複数の要素で置換できるため、これを使用してリストに要素を挿入できます。SET $LIST はリストの要素を NULL 文字列で置換できるため、これを使用してリストの要素または要素の範囲を削除できます。

  • リストの評価: :

    • $LISTVALID は、文字列がリストに有効かどうかを判断します。

    • $LISTLENGTH は、リスト内の要素の数を判断します。

    • $LISTDATA は、指定のリスト要素がデータを含んでいるかどうか判断します。

    • $LISTFIND は、指定した値がリストにあるかどうかを判断して、リストの位置を返します。

    • $LISTSAME は、2 つのリストが同一かどうか判断します。

リストはエンコードされた文字列であるため、Caché ではリストの扱いが標準の文字列の場合とは多少異なります。したがって、リストでは標準の文字列関数を使用しないようにします。さらに、ほとんどのリスト関数は、標準の文字列で使用すると <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),!
        }
     }
}

このプロシージャは、リストの重要な機能を示しています。

  • $LISTFIND は、テストされた値がリスト項目に一致する場合にのみ 1 (True) を返します。

  • $LISTFIND$LISTLENGTH は式で使用します。

リスト関数の詳細は、"Caché 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 乗になります)。

リストと区切り文字列の比較

リストの利点

  • リストは特定の区切り文字を必要としません。$PIECE 関数では複数のデータ項目を含む文字列を管理できますが、これは専用のデリミタとしての文字 (または文字列) の設定にもよります。区切り文字を使用する場合は、データ項目の中にデータとして区切り文字が存在すると、データの区切り位置が混乱する可能性が常に存在しています。リストは区切り文字による混乱を避けるうえで効果的です。したがって、あらゆる文字または文字の組み合わせをデータとして入力できます。

  • データの要素は、$PIECE を使用して区切り文字列から取得するよりも、$LIST または $LISTNEXT を使用してリストから取得する方が高速です。データを順番に取得する場合は、$LIST よりも $LISTNEXT の方が大幅に高速ですが、双方とも $PIECE よりはきわめて高速です。

区切り文字列の利点

  • 区切り文字列では、$FIND 関数を使用して、より柔軟なデータ内容の検索ができます。$LISTFIND は、完全一致を必要とするので、リストの部分一致文字列を検索できません。したがって、上記の例では、アドレス “One Memorial Drive” が文字 “One” で始まっているにもかかわらず、$LISTFIND を使用してメール・リストの文字列 “One” を検索しても 0 (失敗を示す) が返されます。

  • 区切り文字列は標準文字列であるので、標準文字列関数をすべて使用できます。Caché リストはエンコードされた文字列なので、Caché のリストでは $List 関数のみが使用できます。

FeedbackOpens in a new tab