messy
是SAS字符变量,其中包含作者在自己的工作中引用的论文列表。
这里是messy
的一个观察结果。
(label:1;name:Azad, Meghan B;pubyear:2008;volume:4;issue:2;pagenum:195;refwork:Autophagy;collkey:2008051953)(label:2;name:Bai, Jing;pubyear:2012;volume:39;issue:3;pagenum:2697;refwork:Mol Biol Rep;collkey:2012197491)
此记录包含2个引用-一个从"(label:1;"
开始,另一个从"(label:2;"
开始。
我需要为每个引用创建字符变量,这些变量将在“名称:”之后返回部分内容。对于此观察,应如下所示:
clean1 clean2
AZAD.MEGHAN BAI.JING
我尝试在数据步骤中通过scan()
函数执行此操作,
data ex2;
length lastname1-lastname10
lastname1-lastname10
clean1-clean10 $100; /*initializes empty variables for storing up to 10 names*/
set ex;
array lastname {*} lastname1-lastname10;
array firstname {*} firsttname1-firstname10;
array clean {*} clean1-clean10;
do i=1 to count(messy, "label:"); /*loop through messy as many times as there are names*/
lastname{i} = scan(messy, 1, "name:"); /*pick up first word after name*/
firstname{i} = scan(messy, 2, "name:"); /*pick up second word after name*/
clean{i} = cats(upcase(lastname{i}), ".", upcase(firstname{i}));
end;
run;
这里(至少)有两个问题:
scan()
的结果(第一次出现的“名称:”之后的内容)写入姓氏和名字数组中。scan()
本身的工作原理!我以为第三个参数允许我指定选择的分隔符,但是scan(messy, 1, "name:");
的结果返回"(l"
而不是我期望的"AZAD"
。具体要求:
如何获取messy
变量中的所有名称并将它们分别存储为clean1
,clean2
等?
答案 0 :(得分:1)
我会使用PRX *进行此类操作
data ex2;
length clean1-clean10 $100;
set ex;
array clean {*} clean1-clean10;
if _N_=1 then ExpressionID+prxparse('/[(;]name:([^;)]+)[;)]/');
start = 1;
stop = length(messy);
call prxnext(ExpressionID, start, stop, messy, position, length);
i=0;
do while (position > 0);
i+1;
clean{i} = prxposn(ExpressionID, 1, messy);
call prxnext(ExpressionID, start, stop, messy, position, length);
end;
run;