String 在SAS数据集中重新排列地址

String 在SAS数据集中重新排列地址,string,sas,String,Sas,因此,我有一个SAS数据集,其中包含诸如姓名和地址之类的信息。我正在安排地址,以便所有的公寓信息都在最后。例如: 姓名地址 Jon Doe公园大道105号500室 约翰·史密斯,邮编:250,邮编:1690 Amy Squiq 102英特尔驱动器公寓89 Portville 我想把所有地址的格式作为第一个观察(公寓号码在末尾) 这就是我最初拥有的: DATA list; INPUT name $1-10 address $11-50 ; DATALINES; Joe Smith 105 Par

因此,我有一个SAS数据集,其中包含诸如姓名和地址之类的信息。我正在安排地址,以便所有的公寓信息都在最后。例如:

姓名地址
Jon Doe公园大道105号500室
约翰·史密斯,邮编:250,邮编:1690
Amy Squiq 102英特尔驱动器公寓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;

今后,我建议您只发布编程问题。如果你把原来的问题改成程序性的,你就更有可能从别人那里得到帮助。你的问题现在的措辞更适合你;然而,我会给你帮助,因为我有点感兴趣的解决这个问题后,阅读它


下面的代码将向后搜索字符串并返回单词“APT”的位置。如果它大于2,则它不得位于字符串的末尾。如果是,这不是一个编程问题,因为它目前提出,不能在这里回答。如果没有你所有的数据,这也不是真的可以回答的,因为这有各种各样的复杂性(确定公寓号码是什么并不容易).公寓号始终是APT后面的4个字符。不可能提供我所有的数据,所以我给了你一个我见过的三种组合的示例。首先,这不是问题-添加它。其次,您还没有提出编程问题。你不懂如何解决的编程问题是什么?您知道哪些方法可以查找、分离和组合字符串?哪些方法不适用于此?根据SO规则,您确实需要发布一个尝试,尝试使用SCAN()和Substr()解析出地址的各个部分,然后看看它是如何工作的。如果您需要进一步的帮助,请发布您迄今为止的尝试,您将得到进一步的帮助。您也可以在communities.sas.com上发布,该网站没有这些规则,但您可能会收到类似的关于尝试和澄清的回复。您不一定要发布“尝试”,但它必须足够具体,成为一个编程问题,而不仅仅是一个“我如何做我的工作”问题,它必须有足够的细节,你需要知道什么。谢谢你的帮助。这是有效的,我会记得在将来发布一个我尝试过的例子。
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;