我想从sas中的字符串中分离名字、姓氏和年龄

我想从sas中的字符串中分离名字、姓氏和年龄,sas,Sas,输入: David30Miller Jhonty45Rhodes Ahsley63Cummins 所以first name变量应该包含年龄之前的字符,即David age应该包含数字,即30,last name应该包含Miller 所需输出: FirstName Age Last name David 30 Miller Jhonty 45 Rhodes Ahsley 63 Cummins |string |age

输入:

David30Miller   
Jhonty45Rhodes  
Ahsley63Cummins
所以first name变量应该包含年龄之前的字符,即David age应该包含数字,即30,last name应该包含Miller

所需输出:

FirstName Age Last name  
David     30  Miller 
Jhonty    45  Rhodes  
Ahsley    63  Cummins
|string             |age    |first_name   |last_name
|David30Miller      |30     |David        |Miller
|Jhonty45Rhodes     |45     |Jhonty       |Rhodes
|Ahsley63Cummins    |63     |Ahsley       |Cummins

有人能帮忙吗?

步骤1:使用压缩(字符串,,“kd”)提取年龄(其中kd压缩所有留下年龄的字符值)
第2步:使用年龄作为扫描功能的参数,以生成名字和姓氏。扫描(,):第一个参数是要处理的值,第二个参数是要提取字符串的哪一部分,第三个参数是在本例中用于区分(年龄)的符号

data abc;
input string $50.;
cards;
David30Miller
Jhonty45Rhodes
Ahsley63Cummins
;
run;

data abc;
set abc;
age = input(compress(string,,"kd"),best.);
first_name =scan(string,1,age);  /*or scan(string,1,,"d");*/
last_name = scan(string,2,age);  /*or scan(string,2,,"d");*/
run;
我的输出:

FirstName Age Last name  
David     30  Miller 
Jhonty    45  Rhodes  
Ahsley    63  Cummins
|string             |age    |first_name   |last_name
|David30Miller      |30     |David        |Miller
|Jhonty45Rhodes     |45     |Jhonty       |Rhodes
|Ahsley63Cummins    |63     |Ahsley       |Cummins

如果有任何疑问,请告诉我,您也可以使用Prxchange,如下所示。下面是关于代码的简要讨论

 ^([a-z]+)([0-9]+)([a-z]+)$ --- ^ means starting ^([a-z]+) this is group1 with 
 alphabets

 ([0-9]+) is group2 with numbers only

 ([a-z]+)$  is group3. 

 $1 represents group1 which can replace everything with group 1 by using /$1/
  $2 represents group1 which can replace everything with group 2 by using /$2/
 $3 represents group1 which can replace everything with group 3 by using /$3/
在第一个场景中,我们将所有内容替换为第一组给出您的名字等等

data want
set have;
firstname = prxchange('s/^([a-z]+)([0-9]+)([a-z]+)$/$1/i',1,trim(string));
age = input(prxchange('s/^([a-z]+)([0-9]+)([a-z]+)$/$2/i',2,trim(string)),8.);;
lastname = prxchange('s/^([a-z]+)([0-9]+)([a-z]+)$/$3/i',1,trim(string));;
run;

堆栈溢出中的一个好答案不仅仅是代码,而是解释如何教导,而不是给出。真不敢相信你否决了试图帮助你的人的正确答案。我在解释答案,如果你能再等30秒的话。无论如何,如果你不理解代码的任何部分,请告诉我。一直很乐意帮助。DV是我,不是OP。我认为这是一个更好的一点,但请阅读和;这在很大程度上仍然只是将代码提供给问了一个糟糕问题的人。我还建议,没有理由在扫描功能中使用年龄;这是糟糕的设计,因为它会导致不必要的num-char转换。使用
'd'
第四个参数代替。最后-在提交之前写一个完整的答案,不要只写一些东西然后计划改进。这被称为“西方最快的枪”,在这里被认为是非常不合适的。完成后提交答案;再等五分钟点击提交不会伤害任何人。我是这个平台的新手。我没想到像你这样有经验的人会说这样粗鲁的话。总之,我只是想帮助有需要的人。我会记住你的观点。你试过什么?现在这看起来不是一个好问题,特别是即使是少量的研究也至少能提出一些可能性。