This is fixed code that should work for any range of ages/weights. Not the most elegant solution, but it works. But I would still rather fix that at the input site, and put some delimiters into the original string.
data want;
set have;
name=substr(Mixeddata,1, anydigit(Mixeddata)-1);
age=substr(Mixeddata, anydigit(Mixeddata), 2);
gender=substr(Mixeddata, anydigit(Mixeddata)+2,anydigit(mixeddata,-50)-anydigit(mixeddata)-3 );
weight=substr(Mixeddata, anydigit(Mixeddata,-50)-1, 2);
country=substr(Mixeddata, anydigit(Mixeddata, -50)+1);
run;
data want;
set have;
mixed2=substr(Mixeddata, anydigit(Mixeddata), anydigit(Mixeddata,-50)-anydigit(Mixeddata)+1);
mixed3=substr(mixed2, notdigit(mixed2));
name=substr(Mixeddata,1, anydigit(Mixeddata)-1);
age=substr(mixed2,1,notdigit(mixed2)-1);
gender=substr(mixed2, notdigit(mixed2), anydigit(mixed2, 5)-notdigit(mixed2));
country=substr(Mixeddata, anydigit(Mixeddata, -50)+1);
weight=substr(mixed3, anydigit(mixed3));
drop Mixeddata mixed2 mixed3;
run;