JSLのShortest Edit Script()関数は、2つの文字列、行またはシーケンスを比較し、異なる部分のリストまたは異なる部分を記述する行列を戻します。2つの列、リスト、または行列の違いを確認する場合にShortest Edit Script()を使用できます。この関数は、シーケンスAをシーケンスBに変更する最短の方法の一形態を戻します。複数の最短のスクリプトが存在する可能性があります。
t1 = New Table( "t1",
New Column( "Column 1",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 7] )
)
);
t2 = New Table( "t2" ,
New Column( "Column 1",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [2, 3, 4, 5, 2, 3, 4, 5, 2, 3, 4, 5, 6] )
)
);
EditScript = Shortest Edit Script( // テーブルごとに列1を比較
sequences(
N Rows( t1 ),
N Rows( t2 ),
Function( {a, b}, // 列に添え字を付ける
t1:column 1[a] == t2:column 1[b] // データテーブルt1およびt2で
)
)
);
[-1 1 . 1, //文字列aの位置1の1項目を削除
0 2 1 4, // 文字列aの位置2、文字列bの位置1の4項目を保持
-1 6 . 2, // 文字列aの位置6の2項目を削除
1 . 5 4, // 文字列bの位置5の4項目を追加
0 8 9 5, // 文字列aの位置8、文字列bの位置9の5項目を保持
-1 13 . 1] // 文字列aの位置13の1項目を削除
行列の各列は次の内容を表します。
• 列1: 項目の削除(-1)、共通項目の保持(0)、項目の追加(1)
• 列2: 文字列a内の位置
• 列3: 文字列b内の位置
• 列4: 指示の対象となる項目の数
欠測値は、比較の結果その列の値が不用であることを示します。
次の例では、 "@"と "$"を区切り文字として扱います。
aa = "this is$a test of@shortest$edit script lines$with several words";
bb = "this is a$test of$shortest$edit script lines with several@words";
// "@"と "$"は区切り文字
Shortest Edit Script( lines( aa, bb, separators( "@$" ) ) );
{{"Remove", "this is$a test of@"}, {"Insert", "this is a$test of$"}, {"Common",
"shortest$"}, {"Remove", "edit script lines$with several words"}, {"Insert",
"edit script lines with several@words"}}
『スクリプト構文リファレンス』のShortest Edit Script( A, B )を参照してください。