我有一个包含许多从XML解析器解析的标志的列。数据如下所示:
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N;
我必须创建一个包含所有这些列名的表来捕获标志。喜欢:
USERKEYED VALMATCH DEVICEVERIFIED EXCEPTION USERREGISTRD ASSOCIATE EXTERNAL GROSSGIVEN UMAPPED
Y N N N N Y N Y N
Y N N N N Y Y Y N
Y N N Y N Y N Y N
如何在SAS中动态捕获值?在DATA步骤还是PROC步骤?
提前致谢。
答案 0 :(得分:2)
让我们从您的示例输出数据开始。
data expect ;
id+1;
length USERKEYED VALMATCH DEVICEVERIFIED EXCEPTION
USERREGISTRD ASSOCIATE EXTERNAL GROSSGIVEN UMAPPED $1 ;
input USERKEYED -- UMAPPED;
cards4;
Y N N N N Y N Y N
Y N N N N Y Y Y N
Y N N Y N Y N Y N
;;;;
现在我们可以重新创建您的示例输入数据:
data have ;
do until (last.id);
set expect ;
by id ;
array flag _character_;
length string $200 ;
do _n_=1 to dim(flag);
string=catx(';',string,catx('=',vname(flag(_n_)),flag(_n_)));
end;
end;
keep id string;
run;
这将是这样的:
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=Y;GROSSGIVEN=Y;UMAPPED=N
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=Y;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N
因此,要处理此问题,我们需要将变量STRING
中的对解析为具有各个对的多个观察值。值分为NAME
和VALUE
变量。
data middle ;
set have ;
do _n_=1 by 1 while(_n_=1 or scan(string,_n_,';')^=' ');
length name $32 ;
name = scan(scan(string,_n_,';'),1,'=');
value = scan(scan(string,_n_,';'),2,'=');
output;
end;
keep id name value ;
run;
然后我们可以使用PROC TRANSPOSE
将这些观察结果转换为变量。
proc transpose data=middle out=want (drop=_name_) ;
by id;
id name ;
var value ;
run;
答案 1 :(得分:1)
您拥有的数据是一系列名称/值对,使用;
作为分隔符。我们可以一次提取一个名称/值对,然后将它们解析为值:
data tmp;
length my_string next_pair name value $200;
my_string = "USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N;";
cnt = 1;
next_pair = scan(my_string,cnt,";");
do while (next_pair ne "");
name = scan(next_pair,1,"=");
value = scan(next_pair,2,"=");
output;
cnt = cnt + 1;
next_pair = scan(my_string,cnt,";");
end;
keep name value;
run;
给我们:
name value
=================== =====
USERKEYED Y
VALMATCH N
DEVICEVERIFIED N
EXCEPTION N
USERREGISTRD N
ASSOCIATE Y
EXTERNAL N
GROSSGIVEN Y
UMAPPED N
然后,我们可以转置数据,以便将名称用于列名:
proc transpose data=tmp out=want(drop=_name_);
id name;
var value;
run;
为您提供所需的表格。
答案 2 :(得分:0)
DATA <MY_DATASET>;
SET INPUT_DATASET;
USERKEYED = substr(input_column, find(input_column, 'USERKEYED=')+10,1);
VALMATCH = substr(input_column, find(input_column, 'VALMATCH=')+9,1);
DEVICEVERIFIED = substr(input_column, find(input_column, 'DEVICEVERIFIED=')+15,1);
EXCEPTION = substr(input_column, find(input_column, 'EXCEPTION=')+10,1);
USERREGISTRD = substr(input_column, find(input_column, 'USERREGISTRD=')+13,1);
ASSOCIATE = substr(input_column, find(input_column, 'ASSOCIATE=')+10,1); EXTERNAL = substr(input_column, find(input_column, 'EXTERNAL=')+9,1);
GROSSGIVEN = substr(input_column, find(input_column, 'GROSSGIVEN=')+11,1);
UMAPPED = substr(input_column, find(input_column, UMAPPED=')+8,1);
run;
答案 3 :(得分:0)
我的答案主要是在第一段代码中,其余的只是解释,一个替代方案和一个很好的提示。
根据您给出的答案,输入数据已经在SAS数据集中,因此可以读取以创建SAS代码文件,然后可以使用%include
运行{{1} } 不必需:
proc transpose
由于输入数据几乎已经像SAS赋值语句,我们已经利用了这一点,因此使用filename tempcode '<path><file-name.txt>'; /* set this up yourself */
/* write out SAS code to the fileref tempcode */
data _null_;
file tempcode;
set have;
if _n_=1 then
put 'Y="Y"; N="N"; drop Y N;';
put input_column;
put 'output;';
run;
/* %include the code to create the desired output */
data want;
%include tempcode;
run;
从fileref tempcode运行的SAS代码应如下所示:
%include
作为替代方案,fileref tempcode可以包含数据步骤的所有代码&#34; Y="Y"; N="N"; drop Y N;
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N;
output;
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=N;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=Y;GROSSGIVEN=Y;UMAPPED=N;
output;
USERKEYED=Y;VALMATCH=N;DEVICEVERIFIED=N;EXCEPTION=Y;USERREGISTRD=N;ASSOCIATE=Y;EXTERNAL=N;GROSSGIVEN=Y;UMAPPED=N;
output;
&#34;:
data want;
作为提示,要查看日志中/* write out entire SAS data step code to the fileref tempcode */
data _null_;
file tempcode;
set have end=lastrec;
if _n_=1 then
put 'data want;'
/'Y="Y"; N="N"; drop Y N;';
put input_column;
put 'output;';
if lastrec then
put 'run;';
run;
%include tempcode; /* no need for surrounding SAS code */
处理的代码,您可以使用以下变体:
%include
希望这一切都有帮助(并且有效!)
此致 阿米尔。