如何在SAS中使用xmlengine(xmlmapper)添加基于计数器的变量并输出到xml文件?
我有两个数据集,其中一些记录彼此相关 例如 数据集1 Var1 abcde 坏人 大爆炸 奇怪的 每天 正是 数据集2 var1 abc cde 坏的 坏人 陌生人 现在我想用循环逻辑比较这些记录,下面是我的代码 %让id1=%sysfunc(打开(数据集2,in)); %让colterm=%sysfunc(varnum(&id1,var1)); %执行%while(%sysfunc(获取(&id1))等式0); %让vterm=%sysfunc(getvarc(&id1,&colterm)) 现在dataset1如下所示如何在SAS中使用xmlengine(xmlmapper)添加基于计数器的变量并输出到xml文件?,sas,xmlmapper,Sas,Xmlmapper,我有两个数据集,其中一些记录彼此相关 例如 数据集1 Var1 abcde 坏人 大爆炸 奇怪的 每天 正是 数据集2 var1 abc cde 坏的 坏人 陌生人 现在我想用循环逻辑比较这些记录,下面是我的代码 %让id1=%sysfunc(打开(数据集2,in)); %让colterm=%sysfunc(varnum(&id1,var1)); %执行%while(%sysfunc(获取(&id1))等式0); %让vterm=%sysfunc(getvarc(&id1,&colterm))
<text>abcde</text>
<match>Fuzzy</match>
<matchitem>abc</matchitem>
<matchitem>tecde</matchitem>
Var1cnt匹配
abcde 2模糊
坏人2模糊
大爆炸0
奇怪的1模糊
每天0
正是0
我想将dataset2中的那些相关记录合并到dataset1中,新的dataset1如下所示
<text>abcde</text>
<match>Fuzzy</match>
<matchitem>abc</matchitem>
<matchitem>tecde</matchitem>
Var1cnt匹配FM_数据集2_1FM_数据集2_2
abcde 2模糊abc cde
坏男人模糊的坏男人
大爆炸0
奇怪的1模糊的陌生人
每天0
正是0
正如您所看到的,新变量FM_dataset2_1和FM_dataset2_2是基于一个计数器cnt自动重新分配的变量。但我就是想不出一个正确的方法来实现这一步使用SAS代码
此外,我还需要将数据集输出到一个xml文件中。结果应该如下所示
<text>abcde</text>
<match>Fuzzy</match>
<matchitem>abc</matchitem>
<matchitem>tecde</matchitem>
abcde
模糊的
abc
特克德
与上面的问题一样,问题还涉及如何确定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>
/../matchitem[position()=**1**
...
/../matchitem[position()=**2**
但这必须是一个接一个的方式。是否可以基于cnt计数器(maxnum)自动自定义映射文件
有人能提出建议吗?我肯定有比下面更有效的代码,但我还是尽量坚持你的思路。我不熟悉使用XML引擎,所以我将把这部分留给其他人。否则,如果需要手动创建MAXNUM宏变量,则可以在循环中使用它
%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;
format vterm $20.;
if match eq "Fuzzy" then output;
if index(strip(var1),strip("&vterm"))>0 or index(strip("&vterm"),strip(var1))>0 then do;
cnt=sum(cnt,1);
match="Fuzzy";
vterm = "&vterm";
output;
end;
else do;
cnt=sum(cnt,0);
output;
end;
run;
proc sort data=dataset1;
by var1 match vterm descending cnt;
proc sort data=dataset1 nodupkey;
by var1 match vterm;
run;
%end;
proc sql;
create table maxcnt as
select
var1,
match,
max(cnt) as cnt
from dataset1
group by 1,2
;
quit;
run;
proc transpose data=dataset1 out=dataset1(drop=FM_dataset2_0 _name_) prefix=FM_dataset2_;
by var1 match;
id cnt;
var vterm;
run;
data dataset1;
merge dataset1 maxcnt;
by var1 match;
run;
%let id2=%sysfunc(close(&id1)); /*closes out dataset2 in case you need it later */
我确信有比下面更有效的代码,但我试着坚持你的思路。我不熟悉使用XML引擎,所以我将把这部分留给其他人。否则,如果需要手动创建MAXNUM宏变量,则可以在循环中使用它
%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;
format vterm $20.;
if match eq "Fuzzy" then output;
if index(strip(var1),strip("&vterm"))>0 or index(strip("&vterm"),strip(var1))>0 then do;
cnt=sum(cnt,1);
match="Fuzzy";
vterm = "&vterm";
output;
end;
else do;
cnt=sum(cnt,0);
output;
end;
run;
proc sort data=dataset1;
by var1 match vterm descending cnt;
proc sort data=dataset1 nodupkey;
by var1 match vterm;
run;
%end;
proc sql;
create table maxcnt as
select
var1,
match,
max(cnt) as cnt
from dataset1
group by 1,2
;
quit;
run;
proc transpose data=dataset1 out=dataset1(drop=FM_dataset2_0 _name_) prefix=FM_dataset2_;
by var1 match;
id cnt;
var vterm;
run;
data dataset1;
merge dataset1 maxcnt;
by var1 match;
run;
%let id2=%sysfunc(close(&id1)); /*closes out dataset2 in case you need it later */
谢谢@RWill的回答。稍后我会测试并告诉你结果。:)谢谢@RWill的回答。我将稍后进行测试,并让您知道结果。:)