- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi All,
This is an urgent requirement that I need to fulfil, would highly appreciate it if you help on this.
Question :
I have data like :
data test;
length A $ 4 ;
infile datalines;
input A;
A = put(input(A,best4.),z4.);
datalines;81
1034
91
A46
6HJ
AAAAAA
F39000DSUG08CSDF85000000;
run;
I want the output like :
000081
001034
000091
000A46
0006HJ
AAAAAA
F39000
DSUG08
CSDF85
000000
which is basically I need to add leaing 'zeros' if length is less than 6 but for all 6 length characters I need the same output unaltered. The desired output is given above
I need a particular format for doing this.
I dont need a temporary fix on this
I need a permanent solution as to whatever value comes for the field 'A' I get the output like stated above.
Codes I tried :
A = put(input(A,best4.),z4.); ------- case 1andA = cats(repeat('0',6-length(A)-1), x); ------- case 2case1 :Only the numeric records are getting populated with leading zeros and for rest it is coming as 0case2 :I am getting the desired output as stated above but for some cases I am getting error like :'Function CATS unknown or cannot be accessed.'
Please provide me with a better format for doing this.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Is your data exactly as posted in the data step? You have 81 right after the datalines statement.
The last record is longer than 6 characters so it has to get separated?
How do you know the rules for separation, assume 6 characters per variable?
What happens if the last variable is short when splitting it up, ie last set is only 3 chars?
You have a mix of character/numeric so INPUT and Z6 format won't work.
And if you need a length of 6 why are you using 4 in the code?
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi reeza
Input:
91
81
aaaaaa
bbbbbb
cfg014
456asd
4kj
gh4
0
output :
000091
000081
aaaaaa
bbbbbb
cfg014
456asd
0004kj
000gh4
000000
I have tried both :
padded = put(input(charvar,best6.),z6.);
and
xx = cats(repeat('0',6-length(x)-1), x);
cats somewhere is fine and somewhere is giving the error :
"unknown func CATS and cannot be accessed" but with CATS i am getting the desired output
With the first thing only numeric values are getting populated with eading zeros rest are being changed to 0
Please give me a better format or an alternative for CATS/X/T/Q
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
This works:
data test;
length A $6. ;
infile datalines;
input A $;
b = catt(repeat('0',6-length(a)-1),a);
datalines;
81
91
81
aaaaaa
bbbbbb
cfg014
456asd
4kj
gh4
0
;
run;
proc print data=test;
run;
If you want to build yourself a custom function see the answer to this similar question here:
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
error :Function CATT unknown and cannot be accessed.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
What version of SAS are you using?
Post your code and log.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
This works for sure, no errors in my log.
if length(a) = 6 then b=a;
else b=catt(repeat('0', 6-length(a)-1, a);
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Why am I getting :
FUNCTION CATT unknown or cannot be accessed error.
What are the reasons please tell me.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
What version of SAS are you using?
Post your code and log.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I am using SAS in zOS i.e in mainframe.
When I am trying the syntax :
xx = cats(repeat('0',6-length(x)-1), x);
It works fine when I am reading from datalines and giving any random inputs. It is working perfectly fine without any errors.
But when I am reading a ~ delimitted file and there is a field which is of $6. And when I am trying to conver that field to
xx = cats(repeat('0',6-length(x)-1), x);
I get the error :
FUCNTION CATS not found or cannot be accessed.
But when I am reading from datalines I am not getting the error..
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
1. Either you have an error before that's causing the issue with the function
2. Your SAS version is old and doesn't support the CATT functions.
3. It's not available in Z/OS for some reason - seems unlikely but possible.
4. It's not available via pass through if you're using that
5. You're not using SAS but using a different system (WPS) that doesn't support it
6. Something else that you're likely not conveying in the question here.
Roll a dice I guess.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
can you explain point 4
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
If you can't use CATT() function then use something else.
You could use the SUBSTRN() function.
Or you could use REVERSE(), TRIM() and SUBSTR().
Or make up your own.
data x;
input a $6. ;
cards;
123
abcdef
;
data want ;
set x;
b=substrn('000000',1,6-length(a))||a;
c=reverse(substr(reverse(trim(a))||'000000',1,6));
put (_all_) (=$quote.);
run;
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi tom,
could you show me the output of the program
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Output from @Tom's code:
64
65 data want ;
66 set x;
67 b=substrn('000000',1,6-length(a))||a;
68 c=reverse(substr(reverse(trim(a))||'000000',1,6));
69 put (_all_) (=$quote.);
70 run;
a="123" b="000123" c="000123"
a="abcdef" b="abcdef" c="abcdef"