如何在SAS中使用xmlengine(xmlmapper)添加基于计数器的变量并输出到xml文件?

如何在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))

我有两个数据集,其中一些记录彼此相关

例如

数据集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如下所示

<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的回答。我将稍后进行测试,并让您知道结果。:)