$TRANSLATE
Synopsis
$TRANSLATE(string,identifier,associator) $TR(string,identifier,associator)
パラメータ
string | ソース文字列。数値、文字列リテラル、変数名、あるいは任意の有効な ObjectScript 式を使用できます。 |
identifier | string で検索する 1 つ以上の文字で構成される文字列。数値、文字列リテラル、変数名、あるいは任意の有効な ObjectScript 式を使用できます。 |
associator | オプション — identifier でそれぞれの文字に位置的に対応する 1 つ以上の置換文字で構成される文字列。数値、文字列リテラル、変数名、あるいは任意の有効な ObjectScript 式を使用できます。 |
概要
$TRANSLATE 関数は、ソース文字列の文字単位の置換で構成される新しい文字列を返します。$TRANSLATE 処理では、複数の文字が置換される場合もありますが、1 文字が (最大) 1 文字に置換されるだけの場合もあります。string パラメータの処理を一度に 1 文字行います。入力文字列にある各文字と identifier パラメータにある各文字とを比較します。$TRANSLATE が一致を見つけると、その文字に対して以下のいずれかのアクションを実行します。
-
$TRANSLATE の 2 パラメータ形式は、返された文字列から identifier パラメータの文字を取り除きます。
-
$TRANSLATE の 3 パラメータ形式は、string で見つかった identifier 文字を、associator パラメータから位置的に対応する文字と置き換え、結果の文字列を返します。置換は、文字列単位ではなく文字単位で行われます。identifier パラメータが associator パラメータよりも少数の文字を含む場合、associator パラメータにある余分な文字は無視されます。identifier パラメータが associator パラメータよりも多数の文字を含む場合、identifier パラメータにある余分な文字は出力文字列で削除されます。
$TRANSLATE は、大文字と小文字を区別します。
通常、string、identifier、および associator パラメータは、引用符付きの文字列として指定されます。これらのパラメータのいずれかの値が純粋な数値である場合、文字列の引用符は不要です。ただし、Caché は $TRANSLATE に値を指定する前にパラメータ値をキャノニック形式の数に変換するため、この使用は推奨されません。
$TRANSLATE および $REPLACE
$TRANSLATE は文字と文字をマッチングして置換します。$REPLACE は文字列と文字列をマッチングして置換します。$REPLACE は、1 つ以上の文字の単一の指定された部分文字列を別の部分文字列に置換したり、指定された部分文字列の複数のインスタンスを削除したりできます。$TRANSLATE は、複数の指定された文字を対応する指定された置換文字に置換できます。
$TRANSLATE のマッチングは常に大文字と小文字が区別されます。一方、$REPLACE のマッチングは既定で大文字と小文字が区別されますが、大文字と小文字を区別せずに呼び出すことができます。$TRANSLATE では常にソース文字列の一致対象がすべて置換されます。一方、$REPLACE ではマッチングの開始ポイントおよび/または実行する置換の数を指定できます。
例
以下の例は、$TRANSLATE の 2 つの使用法を示しています。最初の $TRANSLATE では、入力文字列値は変更されません。2 番目の $TRANSLATE では、関数の返り値と同じ値に設定することで、入力文字列値が変更されます。
SET str="The quick brown fox"
SET newstr=$$TRANSLATE(str,"qbf","QBF")
WRITE "source string: ",str,!,"new string: ",newstr,!!
// creates a new string, does not change str value
SET str=$$TRANSLATE(str,"qbf","QBF")
WRITE "revised string: ",str
// creates a new string and replaces str with new string value
以下の例では、2 パラメータ $TRANSLATE が現在のロケールの設定に基づいて数値グループ区切り文字を削除します。
AppropriateInput
SET ds=##class(%SYS.NLS.Format).GetFormatItem("DecimalSeparator")
IF ds="." {SET x="+1,462,543.33"}
ELSE {SET x="+1.462.543,33"}
TranslateNum
WRITE !,"before translation ",x
SET ngs=##class(%SYS.NLS.Format).GetFormatItem("NumericGroupSeparator")
IF ngs="," {SET x=$TRANSLATE(x,",") }
ELSEIF ngs="." {SET x=$TRANSLATE(x,".") }
ELSEIF ngs=" " {SET x=$TRANSLATE(x," ") }
ELSE {WRITE "Non-standard NumericGroupSeparator:", ngs
RETURN }
WRITE !,"after translation ",x
以下の例では、3 パラメータ $TRANSLATE がさまざまな日付区切り文字をスラッシュに置き換えます。associator では、identifier 内の文字数と同数の / を指定する必要があることに注意してください。
SET x(1)="06-23-2014"
SET x(2)="06.24.2014"
SET x(3)="06/25/2014"
SET x(4)="06|26|2014"
SET x(5)="06 27 2014"
FOR i=1:1:5{
SET x(i)=$TRANSLATE(x(i),"- .|","////")
WRITE "x(",i,") :",x(i),!
}
以下の例では、3 パラメータ $TRANSLATE がアクセント付き文字をアクセントなし文字に置き換え、疑問文および感嘆文の接頭辞句読点を削除することで、スペイン語を基本 ASCII に “簡略化” します。
SET esp="¿Sabes lo que ocurrirá en el año 2016?"
WRITE "Spanish:",!,esp,!
SET iden=$CHAR(225)_$CHAR(233)_$CHAR(237)_$CHAR(241)_$CHAR(243)_$CHAR(250)_$CHAR(161)_$CHAR(191)
SET asso="aeinou"
WRITE "Identifier: ",iden,!
WRITE "Associator: ",asso,!
SET spanglish=$TRANSLATE(esp,iden,asso)
WRITE "Spanglish:",!,spanglish
もちろん、この変換は、実際のスペイン語テキストでの使用はお勧めしません。