重新排列SAS数据集中的地址

时间:2015-09-23 18:40:11

标签: string sas

所以我有一个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;

1 个答案:

答案 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;