いくつかのレコードが互いに関連している 2 つのデータ セットがあります。
例えば
データセット1
Var1
abcde
悪人
ビッグ・バン
変
毎日
まさに
データセット2
var1
abc
cde
悪い
悪い男
知らない人
ここで、ループ ロジックを使用してこれらのレコードを比較したいと思います。これが私のコードです。
%let id1=%sysfunc(open(dataset2,in)); %let colterm=%sysfunc(varnum(&id1,var1)); %do %while(%sysfunc(fetch(&id1)) eq 0); %let vterm=%sysfunc(getvarc(&id1,&colterm));
data dataset1;
set dataset1;
if index(strip(var1),strip("&vterm"))>0 or index(strip("&vterm"),strip(var1))>0 then do;/*when one contains the other*/
match="Fuzzy";
cnt=cnt+1;
end;
run;
%end;
proc sql noprint;
select max(cnt) into:maxnum/*to get max cnt*/
from dataset1;
quit;
今、dataset1 は以下のようになります
Var1 cnt 一致
abcde 2 ファジー
悪い男 2 ファジー
ビッグバン 0
奇妙な 1 ファジー
毎日 0
正確に 0
データセット 2 の関連するレコードをデータセット 1 にマージすると、新しいデータセット 1 は次のようになります。
Var1 cnt 一致 FM_dataset2_1 FM_dataset2_2
abcde 2 ファジー abc cde
悪い男 2 ファジー悪い悪い男 a
ビッグバン 0
奇妙な 1 あいまいな見知らぬ人
毎日 0
正確に 0
ご覧のとおり、新しい変数 FM_dataset2_ 1と FM_dataset2_ 2は、1 つのカウンター cnt に基づいて自動再割り当てされた変数です。しかし、SAS コードを使用してこのステップを実現する適切な方法を思いつきませんでした。
さらに、データセットを xml ファイルに出力する必要があります。結果は以下のようになります
<text>abcde</text>
<match>Fuzzy</match>
<matchitem>abc</matchitem>
<matchitem>tecde</matchitem>
問題は、上記の問題と同様に、matchitem 要素の数を決定してファイルに書き込む方法についてもです。xmlマップファイルでは、次のように位置を決定できます
<COLUMN name="FM_dataset2_1">
<PATH syntax="XPath">/../matchitem[position()=**1**]</PATH>
...
<COLUMN name="FM_dataset2_2">
<PATH syntax="XPath">/../matchitem[position()=**2**]</PATH>
ただし、これはケースバイケースで手動で行う必要があります。cnt カウンター (maxnum) に基づいてマップ ファイルを自動的にカスタマイズすることはできますか?
誰でも提案できますか?