在SAS中重新排列字符串中文本的顺序?

时间:2014-06-20 12:59:09

标签: sas character text-manipulation

我有一个带有名为“name”的字符变量的数据集。它包含这样一个人的全名: “firstname middlename lastname”。

我希望将数据重新排列,以便变为: “姓氏,名字中间名”。

我不是SAS功能的硬核,但是我使用了一些我认识的东西。

(我的代码见下文)。

在第一次尝试(test2)中,我没有得到我想要的结果 - 我得到: “lastName,firstName middleName”而不是 “lastName,firstName middleName” - 我的问题是逗号。

所以我认为我会通过在末尾创建包含逗号的新姓氏变量来解决我的问题(在test2_new中)。但我没有得到我想要的东西? SAS最后放了三个点,而不是逗号?

我希望一个比我更有SAS技能的人能回答我的问题吗?

亲切的问候 玛丽亚 enter image description here

2 个答案:

答案 0 :(得分:2)

data have ;
  input @1 text & $64. ;
datalines ;
Susan Smith
David A Jameson
Bruce Thomas Forsyth
;
run ;

data want ;
  set have ;
  lastname = scan(text,-1,' ') ;
  firstnames = substr(text,1,length(text)-length(lastname)) ;
  newname = catx(', ',lastname,firstnames) ;
run ;

哪个给出了

text                    lastname    firstnames      newname

Susan Smith             Smith       Susan           Smith, Susan
David A Jameson         Jameson     David A         Jameson, David A
Bruce Thomas Forsyth    Forsyth     Bruce Thomas    Forsyth, Bruce Thomas

答案 1 :(得分:2)

PERL表达式在这里是一个有用的工具,尤其是PRXCHANGE。 SAS支持网站提供了如何反转名字和姓氏的一个很好的例子,这里稍微修改了该代码。我只为那些有2个或3个名字的人提供服务,但如果有必要的话,扩展它应该相当简单。我的代码基于@Chris J的答案中创建的HAVE数据集。

data want;
set have;
if countw(text)=2 then text = prxchange('s/(\w+) (\w+)/$2, $1/', -1, text);
else if countw(text)=3 then text = prxchange('s/(\w+) (\w+) (\w+)/$3, $1 $2/', -1, text);
run;