如何在SAS中提取字符串的最后4个字符

如何在SAS中提取字符串的最后4个字符,sas,Sas,改进的格式,我有点卡住了,无法提取字符串的最后4个字符。当我写:- indikan=substr(Indikation,length(Indikation)-3,4); 它给出的参数无效。 如何做到这一点?此代码适用于: data temp; indikation = "Idontknow"; run; data temp; set temp; indikan = substrn(indikation,max(1,length(indikation)-3),4); run; 你能提供更多关

改进的格式,我有点卡住了,无法提取字符串的最后4个字符。当我写:-

indikan=substr(Indikation,length(Indikation)-3,4);
它给出的参数无效。
如何做到这一点?

此代码适用于:

data temp;
indikation = "Idontknow";
run;

data temp;
set temp;
indikan = substrn(indikation,max(1,length(indikation)-3),4);
run;

你能提供更多关于变量的上下文吗?如果indikation的长度为3或小于3,我可以看到此错误,或者如果它是数字,则可能会导致问题,因为它正确地证明了数字的正确性()。

如果在某些情况下它可能少于四个字符,我建议添加
max

indikan = substrn(indikation,max(1,length(indikation)-3),4);

我还按照Rob的建议添加了
substrn
,因为它可以更好地处理不够长的字符串。

或者可以使用反向函数两次,如下所示:

data _null_;

   my_string = "Fri Apr 22 13:52:55 +0000 2016";

   _day   = substr(my_string, 9, 2);
   _month = lowcase(substr(my_string, 5, 3));

   * Check the _year out;
   _year  = reverse(substr(reverse(trim(my_string)), 1, 4));

   created_at = input(compress(_day || _month || _year), date9.);

   put my_string=;
   put created_at=weekdatx29.;
run;

尾随空格可能导致错误结果: 因此,在执行substr之前,请先剥离/修剪字符串:

indikan=substr(strip(Indikation),length(strip(Indikation))-3);

必须为您提供最后4个字符,或者您可以尝试这种方法,虽然这种方法最初不太直观,但它稳定、较短、使用的函数较少,并且适用于数字和文本值:

indikan = prxchange("s/.*(.{4}$)/$1/",1,indikation);
输出:


如果还需要返回3个字符或更少的字符串,请使用
substrn()
。另外,如果字符串为空,
substrn()
将优雅地处理此问题。嗯,我没有意识到substrn如此方便-我只知道null字符串返回。我不确定我是否理解为什么它塞满了其他有趣的东西,比如更好的数字处理和自动截断,但它超级方便@RobertPenridge@乔:是的,我也是在看了这个答案后才发现的。就像SAS一样,为更有用的函数提供了不那么直观的名称=)。当我遇到
substrn()
时,我实际上正在检查文档,看看常规
substr()
是否会接受负值作为起始位置(它不会)。我现在肯定有一些代码要去更新了!为了更有可能得到有用的答案,请提供重现问题的样本数据。
data temp;
input trt$;
cards;
treat123
treat121
treat21
treat1
treat1
trea2
;run;

data abc;
set temp;
b=substr(trt,length(trt)-3);
run;
[Output]