所以我有一个SAS数据集,其中包含人员姓名和地址等信息。我正在尝试安排地址,以便所有公寓信息都在最后。例如:
Name Address
Jon Doe 105 Park Ave APT 500
John Smith APT 250 1690 Heading ST
Amy Squiq 102 Intel Drive APT 89 Portville
我希望将格式中的所有地址作为第一个观察点(公寓号码在最后的位置)
这就是我原来拥有的:
DATA list;
INPUT name $1-10 address $11-50 ;
DATALINES;
Joe Smith 105 Park Ave APT 500
John Smith APT 250 1690 Heading ST
Amy Squig 102 Intel Drive APT 89 Portville
Joe Dirtt 1305 dork CT APT 845
;
RUN;
data want;
set list;
ad=findw(address, "APT");
ad2=substr(address, ad,ad+6);
ad3=substr(ad2,1,7);
run;
我遇到的问题是删除" APT ......"在原始地址。在Stu Sztukowski的帮助下,我能够添加一块,最终产品可以使用。
data want;
set list;
ad=findw(address, "APT");
ad2=substr(address, ad,ad+6);
ad3=substr(ad2,1,7);
_apt_removed = compbl(tranwrd(upcase(address),trim(ad3), '') );
new_address = catx(' ', propcase(_apt_removed), ad3);
run;
答案 0 :(得分:0)
将来,我建议您只发布编程问题。如果您将原始问题重新编写为程序化问题,您将更有可能获得其他人的帮助。您目前的问题表达方式更适合communities.sas.com;但是,我会给你帮助,因为我对阅读它时解决问题有点兴趣。
以下代码将向后搜索字符串并返回单词“APT”的位置。如果是> 2,那么它一定不能在字符串的末尾。如果它是< = 2,它就在字符串的末尾,我们只想复制地址。
数字总是跟在“APT”之后,所以我们将它存储在一个临时变量中。然后,我们通过连接APT
和_apt_num
来创建我们的公寓号码部分。
接下来,我们搜索原始地址并从中删除APT <number>
。这个全新的字符串由compbl
函数包围,以便在删除过程中将任何额外的双空格更改为单个空格。
最后,我们接受新字符串并将APT <number>
附加到其末尾。
data want;
set have;
_apt_pos = findw(upcase(address), 'APT',' ','BE');
if(_apt_pos > 2) then do;
_apt_num = scan(upcase(address), _apt_pos-1, ' ', 'B');
_apt_string = cat('APT', ' ', _apt_num);
_apt_removed = compbl(tranwrd(upcase(address),trim(_apt_string), '') );
new_address = catx(' ', propcase(_apt_removed), 'APT', _apt_num);
end;
else new_address = address;
drop _:;
run;