置換表記


目次

はじめに

スクリプトが実行される時、それはLabTalkのインタプリタに送られます。 そして、その操作の中でインタプリタは、%と$で始まる2種類の特別な置換表記を探します。 置換表記が見つかると、次のセクションで説明しているように、インタプリタは元の文字列を別の文字列で置き換えます。 置換された文字列の値は、そのステートメントが実際に実行されるまで分かりません。 したがって、この手順は実行時文字列置換と呼ばれます。

置換法には以下の3つがあります。

%A - %Z

文字列レジスタは、最も簡単な置換の形式です。 文字列レジスタは、スクリプト実行中にその内容によって置換されます。以下がサンプルです。

FDLOG.Open(A);   // ダイアログからファイル名を%Aに入れる
%B=FDLOG.path$;  // ファイルパスを%Bに入れる
doc -open %B%A;  // %B%Aはフルパスとファイル名

文字列レジスタは、より信頼性の高いコードを可能にする文字列変数 (Origin 8) が導入される前の古いスクリプトでよく使用されています。文字列変数の解釈には、%( )置換が使用されます。これについては、次のセクションで説明します。

%( )置換

文字列式の置換

LabTalkコマンドは数値の式を受け付けますが、文字列の式は受け付けません。そのため文字列を引数とする必要がある場合、%( )置換を使った文字列変数または文字列式を渡して、実行時の値を解釈する必要があります。文字列式の最も簡単な形式は、次の例のような1つの文字列変数です。

string str$ = "Book2";         
win -o %(str$) {wks.ncols=;}

ワークシート列とセルの置換

次の表記は、文字列としてワークシートセルにアクセスしたり、どのブックのシートからでも列のデータセット名を取得できます。Origin 8より前のバージョンでは、各ブックは1つのシートしかなかったので、ブック名だけでその内容を参照できました。最近のバージョンでは、複数のワークシートをサポートしているので、そのブックに1つのシートだけが含まれていることが確実でなければ、[workbookname]sheetNameorsheetIndex の形式で特定のシートにアクセスします。

個別セルの内容を返す


例えば、Book1のアクティブワークシートの4番目の列の3行目のセルに25という値が含まれている場合、スクリプトウィンドウに次のステートメントを入力すると、Aを25にセットし、その値を2倍して同じワークブックの"Results"シートの1列目4行に入力します。

A = %(Book1, 4, 3);
%([Book1]Results, 1, 4) = 2 * A;


テキストセルの内容を得るには、文字列変数に代入します。

string strVar$ = %(Book1, 2, 5); // Note : ここでは最後の'$'は必須ではない
strVar$ = ;

戻り値のフォーマット

"W" および"@WL"で現在の列フォーマットの値を返す

文字「W」を「format」パラメータとして使用して、現在の列形式で値を返します。

%([workbookname]sheetname, column, row[,W])


サンプル:

Book2のsheet3のcol(Signal)[3]に 12.3456789という数値があるものとしますが、小数点以下2桁が表示されます(この設定は列プロパティダイアログで行います)。

//現在の列フォーマットを使って文字列Wをフォーマット
//12.35が返される
type "Col(Signal)[3] displayed value is %([Book2]Sheet3,Signal,3,W)";
//フォーマット指定がない場合フル精度
A=%([Book2]Sheet3,Signal,3);
A=;// 12.3456789が表示
//あるいはカスタムフォーマット(例:小数点以下3桁)を指定
type "Showing 3 decimal places:%([Book2]Sheet3,Signal,3,.3)";


他のシンタックスを使用してデータの表示フォーマットを管理します。セルのフォーマットダイアログまたは列プロパティダイアログを使用して編集します。

%([workbookName]sheetName, @WL, column[row][, W])


サンプル:

//表示フォーマットを保つため、@WL オプション付きのWを使用
type "Col(Signal)[3] displayed value is %([Book2]Sheet3, @WL, Signal[3], W)";
//Wを省略した場合、フル精度を返す
B=%([Book2]Sheet3,@WL, Signal[3]);
B=;// 12.3456789が表示
//あるいはカスタムフォーマット(例:小数点以下3桁)を指定
type "Showing 3 decimal places:%([Book2]Sheet3,@WL, Signal,3,.3)";

Origin 9.1以降のフォーマット文字W は、以前のバージョンのC の代わりです。しかし、Originは、現在の列フォーマットの値を返すために%([workbookName]sheetName, column, row,C) の使用をサポートしています。

他のシートのデータセットを含めた計算

ブックまたはシートからデータセット名を取得する(データセット置換)機能は、次のような異なるシートにある列間の計算を行うのにとても役立ちます。

// Sheet2とSheet3のcol(1)を合計し、アクティブシートのcol(1)に入れる 
col(1)=%([%H]sheet2, 1) + %([%H]sheet3, 1);
 
// Book2の最初のシートでcol "signal"を減算 
// そして、アクティブブックのSheet3の列"calibrated"に結果を入れる
%([%H]sheet3, "calibrated")=col(signal) - %([Book2]1,signal);

ロングネームを使う場合、column 名は引用符で囲む必要があります。引用符が無い場合、Originは最初にショートネームを探し、見つからなければ、ロングネームを使用します。上述のサンプルの場合、

%([%H]sheet3, "calibrated")

とすると、強制的にロングネームを探しますが、

%([Book2]1,signal)

とした場合、ショートネームを持つ列がない場合のみロングネームを使います。

ワークシート情報の置換

置換表記でのワークシート列とセルへのアクセスと同様、@置換 (ワークシート情報置換)は、@文字を使って、2番目の引数にある列インデックスまたは列名とは区別されます。この表記は、ワークシート情報とメタデータにアクセスできます。

上記のワークシートの列とセルの置換表jきと同様に、1枚のウィンドウにはまだサポートされている古い構文がありますが、新しい表記(Origin 8で導入)を使用することをお勧めします。

ワークシートの情報を返すには


ここで、オプション は以下(パラメータcolumnNumberはいくつかのオプションで省略されます)のうち一つになります。

オプション 戻り値
@# ワークシートの列の総数を返します。
@CS 列の属性に関係なく、columnNumber列から右に数えて、一番最初の選択されている列のインデックス(columnNumber列を含む)を返します。
@E# columnNumber = 1の場合、ワークシート内のYエラー列数を返します。 columnNumber = 2の場合、現在選択されている領域内のYエラー列数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@H# columnNumber = 1の場合、ワークシート内のXエラー列数を返します。 columnNumber = 2の場合、現在選択されている領域内のXエラー列数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@OY 選択されている列の1番左のY列から数えた、columnNumber列までのオフセットを返します。
@OYX 選択されている列の1番左のY列から数えた、columnNumber Y列までのY列のみのオフセットを返します。
@OYY 選択されている列の1番左のY列から数えた、columnNumber X列までのX列のみのオフセットを返します。
@T 列の属性を返します。 1はY、2は無属性、3はYエラー、4はX、5はラベル、6はZを、7はXエラーを意味します。
@X ワークシートの最も左にあるX列の列番号を返します。 列は左から右へ、列番号が1から順に大きくなります。 %(worksheetName, @X); という構文を使います。
@Xn ワークシートの最も左にあるX列のショートネームを返します。 %(worksheetName, @Xn); という構文を使います。
@Y 選択されている列の1番左の列から数えた、columnNumber列までのオフセットを返します。
@Y- 左側の最初のY列の列番号を返します。 指定した列がY列であれば、columnNumberを返します。Y列が見つからなければ、0を返します。 %(worksheetName, @Y-, ColumnNumber); という構文を使います。
@Y# columnNumber=1の場合、ワークシートのY列の数を返します。 columnNumber=2の場合、現在選択されている領域内のY列の数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@Y+ 右側の最初のY列の列番号を返します。 指定した列がY列であれば、columnNumberを返します。Y列が見つからなければ、0を返します。 %(worksheetName, @Y+, ColumnNumber); という構文を使います。
@YS columnNumber列から右に数えて、一番最初の選択されているY列の番号(columnNumber列を含む)を返します。
@Z# columnNumber=1の場合、ワークシートのZ列の数を返します。 columnNumber=2の場合、現在選択されている領域内のZ列の数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。

この表のオプションは、@オプションまたは@変数として識別される場合があります。テキストラベルオプションページの@オプションは、ワークシート情報の置換でも使用できます。

情報の保存とインポートしたファイルの情報

@W変数は、Originのワークブックおよびワークシート、列だけでなく、インポートしたファイルに保存されているメタデータにアクセスします。

上記と同様のシンタックスを使って、列番号を変数またはノードの情報で置き換えます。

%([workbookName]worksheetName!columnName, @option, varOrNodeName)

オプション 戻り値
@W varOrNodeName の情報を返します。この変数はそのワークブックレベルにあると理解され、ワークブックオーガナイザで確認できます。使用されている場合worksheetName!ColumnNameを指定する必要はありません。
@WFn n番目のインポートしたファイルに対してvarOrNodeName の情報を返します。変数はワークブックオーガナイザで確認できます。
@WS varOrNodeName の情報を返します。この変数はそのワークブックレベルにあると理解され、ワークシートオーガナイザで確認できます。使用されている場合ColumnNameを指定する必要はありません。
@WC varOrNodeName の情報を返します。この変数はその列レベルにあると理解され、列プロパティダイアログで確認できます。


@置換のサンプル

以下のスクリプトは、Book 2、Sheet 3の4番目の列の列タイプを返します。

string colType$ = %([Book2]Sheet3, @T, 4);  
colType$=;

インポートフィルタは、ワークブックと共に保存されるインポートファイルに関する情報のツリー構造を作成できます。 ここでは、複数ファイルのインポートの場合、現在のブックにインポートされた3番目のデータセットのポイント数を返します。

%z=%(%H,@WF3,variables.header.noofpoints);
%z=

現在のアクティブワークシートが6つの列(XYYYYY)を持っているとします。もし、列2,4,5が選択されているとすると、以下のスクリプトは、columnNumber列(3つ目の引数)から右に数えて、1番最初の選択されたY列番号(columnNumber列を含む)を返します。

loop(ii,1,6)
{
    type -l %(%H, @YS, ii),;
}
type;

これにより以下が出力されます。

   2,2,4,4,5,0,

凡例と軸タイトルの置換

グラフの凡例と軸タイトルも %( )置換を使うことができます。最初の引数は整数値で、最初の引数がワークシート指定子であるような他の%( )置換とは区別されなければなりません。凡例と軸タイトルの置換のシンタックスは次のようになります。

%(PlotIndex[, @option])

ここで、PlotIndex は現在のレイヤにあるデータプロットのインデックスあるいは、クエスチョンマーク("?")です。多くのオプションをPlotIndex の後に指定でき、通常、データセットと結びついているプロット属性の文字(X, Y, Z)であり、指定していなければ、Yと見なされます。指定されていれば、@オプションは、凡例の内容を制御します。 例えば、

// 現在のグラフレイヤの凡例内で ...
// 最初の従属データセットのロングネームを表示
legend.text$ = %(1Y, @LL)  
 
// 同等のコマンド(デフォルトのYが使われる)
legend.text$ = %(1, @LL)

次のスクリプトは、凡例に2番目の独立データセット(例; X)のショートネームを表示します。

legend.text$ = %(2X, @LS)

%(?Y) は軸タイトルを、インデックス(1,2,...n)ではなく、事前に指定されたデータプロットインデックス(作図の詳細:凡例/タイトル:自動軸タイトルのデータプロットインデックスで設定)にデフォルトで設定する可変構文です。 Yデータのロングネームとそれに続く単位を左Y軸のタイトルとして<>内に表示するには、次のようにします。

yl.text$ = %(?Y,@(@LL<@LU>));


凡例の置換表記ページの詳細な情報と、@オプションの完全なリストのテキストラベルオプションページを参照してください。

Note: この凡例の変更スタイルは、単一の凡例項目のみの変更に限られますが、作図の詳細ダイアログで使用することができるよう構成されています。

legendupdate Xファンクションは、スクリプトから凡例を編集するより簡単で包括的な方法を提供します。

キーワード置換

%( ) 置換表記は、タブや改行などの非印刷文字 (制御文字とも呼ばれる) を文字列に挿入するためにも使用されます。 これらの印刷されない文字にアクセスするには、LabTalk キーワードを使用します。 例えば、

// 改行、ラインフィード(CRLF)を文字列に挿入
string ss$ = "Hello%(CRLF)Goodbye";
ss$=;     // ANS: 'Hello', 'Goodbye' が別の行に出力
// 直接入力可能
type ss$;
// リテラルと混合する場合は%()置換を使用
ty I say %(ss$) you say;

$( ) 置換

数値を文字列に変換するには$()置換を使用します。 この表記は、与えられた数式を実行時に評価し、その結果を数値文字列に変換して置き換えます。

この表記は次のような構成で使用します。

$(expression [, format])

ここで、expression は数式ですが、通常、1つの数値または変数(データセットまたはデータ範囲)であり、 format は、Originの出力形式またはC言語形式にすることができます。

expression がデータセットまたは範囲変数の場合、スケール区切りの値リストを返します。(利用可能なバージョン: 9.1 SR0以降)

//データセットを定義
dataset ds1 = {1, 3, 5, 7};
//置換表記の結果を出力
type $(ds1);//ANS:1 3 5 7;
type $(ds1, *2);//ANS: 1.0 3.0 5.0 7.0

/第1列の値を範囲変数rxに渡す
range rx = col(1);
//置換表記の結果出力
type $(rx);

デフォルトフォーマット

角括弧は、format$() 置換表記に対して任意の引数であることを示します。 もし、format を除外すると、Originは@SDシステム変数(デフォルト値は14)により指定された桁または有効桁数でexpressionを実行します。 例えば、

double aa =  3.14159265358979323846;
type $(aa);    // ANS: 3.1415926535898

Originフォーマット

Originは、ワークシートまたはテキストラベルの数値のカスタムフォーマットをサポートしています。以下は部分的なリストであり、概念を示すためだけのものです。数値フォーマットオプションの全リストは、Reference Tables: Origin Formatsを参照してください。


フォーマット 説明
*n n 桁の有効桁数を表示します。
.n n 桁の小数桁数を表示します。
*n* n桁の有効数字を表示し、末尾のゼロを切り捨てます
.n, カンマ区切り記号を使用して、小数点以下n桁を表示(US, UK, など)
E.n 工学表記でn 桁の小数桁数を表示します。
S*n 1E3の形式の科学表記で n 桁の有効桁数を表示
D<format> カスタム日付形式を表示します。ここで、<format> は、列プロパティ表示リストの先頭から始まる、フォーマットのインデックス番号(0からカウント)または、これらの日時形式指定子を使用して作成された文字列のいずれかです。@D構文で使用する必要があります。下のサンプルをご覧ください。
T<フォーマット> カスタム時間形式を表示します。ここで、<format> は、列プロパティ表示リストの先頭から始まる、フォーマットのインデックス番号(0からカウント)または、これらの時間形式指定子を使用して作成された文字列のいずれかです。 @D構文で使用する必要があります。下のサンプルをご覧ください。
#n 整数値をn桁で表示、必要な場所で、0を付加
<prefix>##<sep>###<suffix> 数字の間にセパレータ (<sep>) を指定して数値を表示し、オプションで接頭語(<prefix>) や接尾辞 (<suffix>)を追加します。1つの#記号は1桁を示します。この式の最後の#は、常に単位の数字を参照します。最初と2番目の部分の#の数は変更できます。
# #/n n を分母として指定して、数値を小数として丸めて表示します。分子と分母はスラッシュ/で区切られます。分子の桁数は調整されます。
D[<space>]M[S][F][n] 度数をDegree° Minute' Second"の形式で表示します。ここで、1度= 60分、1分= 60秒です。それぞれを区切るためにスペースを挿入します。N は、分数の小数点以下の桁を示します。Fは、記号なしで区切り記号としてスペースを挿入して次数を表示します。


例:

xx = 1.23456;
type "xx = $(xx, *2)";  // ANS: 1.2
type "xx = $(xx, .2)";  // ANS: 1.23

yy = 1.10001;
type "yy = $(yy, *4)";   // ANS: 1.100
type "yy = $(yy, *4*)";  // ANS: 1.1

zz = 203465987;
type "zz = $(zz, E*3)";  // ANS: 203M 
type "zz = $(zz, S*3)";  // ANS: 2.03E+08

type "$(45, #5)";    // ANS: 00045

type "$(56000, ##+###)"; //ANS: 56+000

type "$(4000, ##+##M)"; //ANS: 40+00M

type "$(10000, .0,)"; //ANS: 10,000

//分数をさまざまな形式で表示:
AA = 0.334;
type "AA = $(AA, # ##/##)"; //ANS: AA = 1/3
type "AA = $(AA, # #/8)"; //ANS: AA = 3/8

//さまざまな形式で度数を表示
DD = 37.34255;
type "DD = $(DD, DMS)"; //ANS: DD = 37°20'33"
type "DD = $(DD, D MS)"; //ANS: DD = 37° 20' 33"
type "DD = $(DD, DMSF)"; //ANS: DD = 37 20 33
type "DD = $(DD, DMF1)"; //ANS: DD = 37 20.6

//Origin Date & Time 関数を使用して日時を返す
type "$(date(7/20/2009), D1)";  // ANS: Monday, July 20, 2009
type "$(date(7/20/2009), Dyyyy'-'MM'-'dd)";  // ANS: 2009-07-20
type "$(time(14:31:04), T4)";   // ANS: 02 PM
type "$(time(14:31:04), Thh'.'mm'.'ss)";  // ANS: 02.31.04

//@DでD<format>またはT<format>を使って日時を返す
DT=2459858.6946202;
type "DT = $(@D, D0)"; // ANS: DT = 10/6/2022
type "DT = $(@D, D1)"; // ANS: DT = Thursday, October 6, 2022
type "DT = $(@D, DMM-dd-yyyy HH:mm:ss)"; // ANS: DT = 10-06-2022 16:53:00
type "DT = $(@D, DMM-dd-yyyy h:mm:ss tt)"; // ANS: DT = 10-06-2022 4:58:07 PM
type "DT = $(@D, T0)"; // ANS: DT = 16:53
type "DT = $(@D, THH:mm:ss.##)"; // ANS: DT = 16:53:00.00
type "DT = $(@D, TDDD:HH:mm:ss:##)"; // ANS: DT = 2459858:16:53:00:00

C言語の形式

$() 置換の format の部分は、C言語形式のステートメントもサポートします。

オプション 符号の有無 出力 入力範囲
d, i 符号付き 整数値(小数の整数部分または整数値) -2^31 -- 2^31 -1
f, e, E, g, G 符号付き 十進数、科学表記、十進または科学表記 +/-1e290 -- +/-1e-290
o, u, x, X 符号なし 8進数、整数、16進数、16進数(大文字) -2^31 -- 2^32 - 1

Note: 最後のカテゴリでは、負の値は2つの成分で表されます。

LabTalkで使用するCコードのサンプルは以下の通りです。

double nn = -247.56;
type "Value: $(nn,%d)";   // ANS: -247

double nn = 1.23456e5;
type "Values: $(nn, %9.4f), $(nn, %9.4E), $(nn, %g)";
// ANS: 123456.0000, 1.2346E+005, 123456

double nn = 1.23456e6;
type "Values: $(nn, %9.4f), $(nn, %9.4E), $(nn, %g)";
// ANS: 123456.0000, 1.2346E+006, 1.23456e+006

double nn = 65551;
type "Values: $(nn, %o), $(nn, %u), $(nn, %X)";
// ANS: 200017, 65551, 1000F

OriginとC言語の形式の組合せ

Originは、C言語形式の指定子を使って、ES の形式の使用をサポートしています。 例えば、

xx = 1e6;
type "xx = $(xx, E%4.2f)";  // ANS: 1.00M

負の値の表示

type コマンド(およびその他)のコマンド解析は、オプションスイッチ指示子として - 記号を探します。変数Kに負の値を割り当て、typeコマンドを使ってその値を表す場合、引用符または括弧で置換表記を囲み - 記号を保護する必要があります。例えば、

K = -5;
type "$(K)"; // これは動作する
type ($(K)); // これも動作する
type $(K);   // これはtypeコマンドが -5オプションを持たないのでエラー

変数の動的な名前付けと作成

代入ステートメントでは、置換表記$()は、代入演算子の右辺、左辺のいずれの側にあるかに関係なく、置換操作をし、値を与えます。

このスクリプトは、値 2 を持つ変数 A を作成します。

A = 2;

次に、次の表記法で値 3 を持つ変数 A2 を作成できます。

A$(A) = 3;

スクリプトウィンドウに A$(A) = または A2 = を入力して、確認できます。


$()置換の他のサンプルについては、数値から文字列への変換をご覧下さい。

%nマクロとスクリプト引数

%n 形式の置換は、マクロまたはスクリプトセクションに渡される引数で使われます。ここでn は1-5の整数です (最大5つまでの引数をマクロまたはスクリプトに渡すことができます) 。

次のスクリプトサンプルは、二つの引数(%1と%2)を取り、それらを足し合わせ、合計をダイアログボックスに出力するマクロを定義しています。

def add {type -b "(%1 + %2) = $(%1 + %2)"}

定義をしたら、次のように入力してマクロを実行できます。

add -13 27;

出力文字列は次のとおりです。

(-13 + 27) = 14

置換表記 $(%1 + %2) は、14という文字表現が結果となります。