得到以下示例
我试图知道表tata中列nomvar
中的字符串的任何部分是否存在于表toto的col1中,如果是,请使用col2给我定义。
对于I2010,RT,IS-IPI,F_CC11_X_CCXBA,我会在intitule
栏中找到“是,toto,tata,井”
我考虑过使用带有插入和选择的proc sql
但是我有两个表,我需要进行连接。
与此同时,我想在一张桌子上放一切,但我不确定这是不是一个好主意。
任何建议都受到欢迎,因为我已经陷入困境。
答案 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;
,然后(如果需要)重新组合。