我必须从给定的字符串中获取子字符串,以便最后两个字符从最终输出中消失。
我的数据:
我的代码:
data test;
set myclass.department;
last_name=scan(name,2,',');
run;
请就此提出建议。
谢谢!
答案 0 :(得分:0)
使用Length()计算字符串的长度,然后使用SUBSTR()函数和LENGTH() - 2,这是你想要的长度。
由于我没有在图片中输入您的数据,我使用的是您默认应该拥有的SASHELP.CLASS数据集:
data class;
set sashelp.class;
new_name = substr(name, 1, length(name)-2);
run;
proc print;
run;
答案 1 :(得分:0)
你很接近并且@Reeza关于在读取数据时修复数据的建议更合适,并且也使用她的长度声明。所有你错过的是substr功能
data test;
set myclass.department;
lastname= substr(scan(name,2),1, length(scan(name,2,' '))-2);
run;
如果您的数据格式相同,则可以使用prxchange,如下所示。
data TEST;
set myclass.department ;
length lastname $25;
lastname= prxchange('s/(.+\s+)(.+)(.{2})/$2/', -1, trim(name));
RUN;
答案 2 :(得分:0)
scan
是提取应该是所需姓氏的第一步。第二步是删除姓氏的最后两个字母。
对于玩具数据的情况,您正在学习第一个概念,您可以假定某些清洁度(方式1.a)。您还应该了解程序数据向量(pdv)中发生的默认情况。学习某些功能的微妙的SAS功能也是有益的(方式2)
data want;
set have;
使用lastname
提取scan()
该变量的存储空间(即长度属性)将自动设置为与变量 name
lastname = scan (name, 2, ',');
使用substr
提取
假设姓氏值总是超过2个字符
* way 1.a;
lastname = substr(lastname, 1, length(lastname)-2);
处理'短'将导致way 1.a
LOG的值
NOTE: Invalid third argument to function SUBSTR at line ...
* way 1.b - presume 'lastname' content takes precedence over `state;
if length(lastname) > 2
then lastname = substr(lastname, 1, length(lastname)-2);
* way 1.c - presume 'state' content takes precedence over `lastname`
if length(lastname) > 2
then lastname = substr(lastname, 1, length(lastname)-2);
else lastname = ' ';
逐字消灭最后两个字符!
* way 2 - substr() on the left hand side;
substr(lastname, max(length(lastname)-1,1)) = ' ';
run;