语法搜索带有sas的字符串

时间:2014-07-01 16:48:35

标签: sas

得到以下示例

enter image description here

我试图知道表tata中列nomvar中的字符串的任何部分是否存在于表toto的col1中,如果是,请使用col2给我定义。

对于I2010,RT,IS-IPI,F_CC11_X_CCXBA,我会在intitule栏中找到“是,toto,tata,井”

我考虑过使用带有插入和选择的proc sql但是我有两个表,我需要进行连接。

与此同时,我想在一张桌子上放一切,但我不确定这是不是一个好主意。

任何建议都受到欢迎,因为我已经陷入困境。

2 个答案:

答案 0 :(得分:3)

SAS数据步骤哈希对象是一种很好的方法。它允许您将Toto表读入内存,它将成为您的查找表。然后,您只需使用扫描函数,标记化并查找col2值,从Tata表中查找字符串。这是代码。

顺便说一句,将Tata表转换为像Toto这样的结构并执行连接也是一种非常理性的方式。

/*Create sample data*/
data toto;
   length col1 col2 $ 100;
   col1='I2010';
   col2='yes';
   output;

   col1='RT';
   col2='toto';
   output;

   col1='IS-IPI';
   col2='tata';
   output;

   col1='F_CC11_X_CCXBA';
   col2='well';
   output;
run;

data tata;
   length nomvar intitule $ 100;
   nomvar='I2010,RT,IS-IPI,F_CC11_X_CCXBA';
run;

/*Now for the solution*/
/*You can do this lookup easily with a data step hash object*/
data tata;
  set tata;
  length col1 col2 token $ 100;
  drop col1 col2 token i sepchar rc;

  /*slurp the data in from the Toto data set into the hash*/
  if (_n_ = 1) then do;
     declare hash toto_hash(dataset: 'work.toto');
     rc = toto_hash.definekey('col1');
     rc = toto_hash.definedata('col2');
     toto_hash.definedone();
  end;

  /*now walk the tokens in data set tata and perform the lookup to get each value*/
  i = 1;
  sepchar = ''; /*this will be a comma after the first iteration of the loop*/
  intitule = '';
  do until (token = '');

     /*grab nth item in the comma-separated list*/
     token = scan(nomvar, i, ',');
     /*lookup the col2 value from the toto data set*/
     rc = toto_hash.find(key:token);
     if (rc = 0) then do;
        /*lookup successful so tack the value on*/
        intitule = strip(intitule) || sepchar || col2; 
        sepchar = ',';
     end;

     i = i + 1;
  end;
run;

答案 1 :(得分:2)

假设您的数据都是这样的结构(您正在查看.个字符之间的不同字符串)我认为最简单的方法是规范化TATA(按{{1}分割然后进行直接连接,然后(如果需要)转置回来。 (将它保持垂直可能更好 - 很可能你会发现这种更有用的分析结构。)

.

现在你可以加入data tata_v; set tata; call scan(nomvar,1,position,length,'.'); do _i = 1 by 1 while position le 0); nomvar_out = substr(nomvar,position,length); output; call scan(nomvar,_i+1,position,length,'.'); end; run; ,然后(如果需要)重新组合。