mise en forme améliorée, je suis un peu coincé où je ne suis pas en mesure d'extraire les 4 derniers caractères de la chaîne., lorsque j'écris: -
indikan=substr(Indikation,length(Indikation)-3,4);
C'est donner un argument invalide.
comment faire cela?
Ce code fonctionne:
data temp;
indikation = "Idontknow";
run;
data temp;
set temp;
indikan = substrn(indikation,max(1,length(indikation)-3),4);
run;
Pouvez-vous fournir plus de contexte sur la variable? Si indikation a une longueur inférieure ou égale à 3, je peux voir cette erreur ou si elle était numérique, cela pourrait poser des problèmes, car il justifie les chiffres ( http://support.sas.com/documentation/cdl/en/lrdict/64316 /HTML/default/viewer.htm#a000245907.htm ).
S'il est probable qu'il y ait moins de quatre caractères dans certains cas, je recommanderais d'ajouter max
:
indikan = substrn(indikation,max(1,length(indikation)-3),4);
J'ai également ajouté substrn
, comme le suggère Rob, étant donné qu'il gère mieux une chaîne trop longue.
Ou on pourrait utiliser la fonction inverse deux fois, comme ceci:
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;
Des résultats erronés peuvent être dus à des blancs à la fin: Par conséquent, avant d’exécuter Sub, effacez/coupez votre chaîne:
indikan=substr(strip(Indikation),length(strip(Indikation))-3);
doit vous donner 4 derniers caractères
Ou vous pouvez essayer cette approche qui, bien que initialement un peu moins intuitive, est stable, plus courte, utilise moins de fonctions et fonctionne avec des valeurs numériques et textuelles:
indikan = prxchange("s/.*(.{4}$)/$1/",1,indikation);