INPUT VSPUT
MSUG | Donna Chan | August 29, 2012
FUNCTIONS
WIIFM BREW SOME SAS-SY
GOODNESS
INPUT+PUT FUNCTIONS
? ()
WIIFM?
123 abc
INPUT+PUT FUNCTIONS ( )
text in
text out
input ;
text in
text out
input ;
put ;
text in
text out
INPUT/PUT statements and functions
are close cousins.
; ()
input()
put()
text in
text out
input()
put()
text in
text out
input()
new = input(old, informat.) ;
abc123
abc123
date_char
‘05282012’
‘06012012’
‘07052012’
new = input(old, informat.) ;
date_num
19141
19145
19179
input()
abc123
date_char
‘05282012’
‘06012012’
‘07052012’
date_num = input(date_char, mmddyy8.) ;
date_num
19141
19145
19179
input()
abc123
date_char
‘05282012’
‘06012012’
‘07052012’
date_num = input(date_char, mmddyy8.) ;
date_num
19141
19145
19179
input()
abc123
date_char
‘05282012’
‘06012012’
‘07052012’
date_num = input(date_char, mmddyy8.) ;
date_num
19141
19145
19179
input()
E
abc123
date_char
‘05282012’
‘06012012’
‘07052012’
date_num = input(date_char, mmddyy8.) ;
date_num
05/28/2012
06/01/2012
07/05/2012
format date_num mmddyy10. ;
input()
C
abc123
date_char
‘05282012’
‘06012012’
‘07052012’
date_num = input(date_char, mmddyy8.) ;
date_num
05/28/2012
06/01/2012
07/05/2012
format date_num mmddyy10. ;
input()
C
I
abc123
some_num
05282012
06012012
07052012
date_num = input(some_num, mmddyy8.) ;
date_num
?
format date_num mmddyy10. ;
input()
abc123
some_num
05282012
06012012
07052012
date_num = input(some_num, mmddyy8.) ;
date_num
.
.
.
format date_num mmddyy10. ;
input()
abc123
some_num
05282012
06012012
07052012
date_num
.
.
.
format date_num mmddyy10. ;
input()
NOTE: Numeric values have been converted to
character values at the places given by:
(Line):(Column).
date_num = input(some_num, mmddyy8.) ;
Old var is always char.
Format dates.
❶ ❷ ❸
input()
If old var is num, SAS returns note.
❹
abc123
new = input(old, informat.) ;
Informat describes how old var appears—in new var type.
input()
put()
text in
text out
new = put(old, format.) ;
put() 123abc
123abc
ID_num
.
1245
35
659845
new = put(old, format.) ;
ID_char
19141
19145
19179
put()
123abc
ID_char = put(ID_num, z6.) ;
ID_num
.
1245
35
659845
put()
ID_char
‘ .’
‘001245’
‘000035’
‘659845’
123abc
ID_char = put(ID_num, z6.) ;
ID_num
.
1245
35
659845
ID_char
‘ .’
‘001245’
‘000035’
‘659845’
put()
E
123abc
else ID_char = put(ID_num, z6.) ;
ID_num
.
1245
35
659845
ID_char
‘’
‘001245’
‘000035’
‘659845’
if ID_num eq . then ID_char = ‘’ ;
put()
C
123abc
ID_char = put(ID_num, z6.) ;
ID_num
.
1245
35
659845
ID_char
‘ .’
‘001245’
‘000035’
‘659845’
I
put()
123abc
ID_char = put(ID_num, $6.) ;
ID_num
.
1245
35
659845
ID_char
? ’
put()
123abc
ID_num
.
1245
35
659845
ID_char
‘ .’
‘ 1245’
‘ 35’
‘659845’
put()
ID_char = put(ID_num, $6.) ;
123abc
ID_num
.
1245
35
659845
ID_char
‘ .’
‘ 1245’
‘ 35’
‘659845’
WARNING: Variable ID_num has already
been defined as numeric.
put()
ID_char = put(ID_num, $6.) ;
put()
New var is always char.
Hardcode missings.
❶ ❷ ❸ Using new var format type will throw warning.
❹
123abc
new = put(old, format.) ;
Format describes what the new var looks like—in old var type.
SAS-SY GOODNESS
BREW SOME
round 1 abc abc ?
round 1
ID_new
‘000451’
‘000934’
‘005660’
‘049712’
‘180456’
‘196245’
abc abc ?
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
round 1 abc abc
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
ID_new
‘000451’
‘000934’
‘005660’
‘049712’
‘180456’
‘196245’
ID_new = put(input(ID_old, 6.0), z6.0) ;
ID_new = put(input(ID_old, 6.0), z6.0) ;
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
char
round 1 abc abc
ID_new = put(input(ID_old, 6.0), z6.0) ;
(inter_num)
451
934
5660
49712
180456
196245
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
char num
round 1 abc abc
ID_new = put(inter_num, z6.0) ;
(inter_num)
451
934
5660
49712
180456
196245
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
char num
round 1 abc abc
ID_new = put(inter_num, z6.0) ;
(inter_num)
451
934
5660
49712
180456
196245
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
char num
round 1 abc abc
ID_new
000451
000934
005660
049712
180456
196245
(inter_num)
451
934
5660
49712
180456
196245
ID_old
‘451’
‘934’
‘5660’
‘49712’
‘180456’
‘196245’
char num char
round 1 abc abc
ID_new = put(inter_num, z6.0) ;
new = put(input(old, 6.0), z6.0) ;
round 1
Nest functions when going from char to char.
Don’t be afraid; break it down step-by-step.
❶ ❷
abc abc
round 2 custom informat: abc 123 ?
gpa_char
‘A-’
‘B+’
‘C’
‘B-’
‘B’
‘D’
gpa_num
‘000451’
‘000934’
‘005660’
‘049712’
‘180456’
‘196245’
round 2 custom informat: abc 123 ?
if gpa_char in ('A+' 'A') then gpa_num = 4.0 ;
else if gpa_char = 'A-' then gpa_num = 3.7 ;
else if gpa_char = 'B+' then gpa_num = 3.3 ;
else if gpa_char = 'B' then gpa_num = 3.0 ;
else if gpa_char = 'B-' then gpa_num = 2.7 ;
else if gpa_char = 'C+' then gpa_num = 2.3 ;
else if gpa_char = 'C' then gpa_num = 2.0 ;
else if gpa_char = 'D' then gpa_num = 1.0 ;
else if gpa_char = 'F' then gpa_num = 0 ;
else gpa_char = '' ;
round 2 custom informat: abc 123
proc format;
invalue gpafmt ‘A+’ = 4.0
‘A’ = 4.0
‘A-’ = 3.7
‘B+’ = 3.3
‘B’ = 3.0
‘B-’ = 2.7
‘C+’ = 2.3
‘C’ = 2.0
‘D’ = 1.0
‘F’ = 0 ;
run;
gpa_num = input(gpa_char, gpafmt.);
round 2 custom informat: abc 123
round 2
gpa_char
‘A-’
‘B+’
‘C’
‘B-’
‘B’
‘D’
gpa_num
3.7
3.3
2.0
2.7
3.0
1.0
custom informat: abc 123
gpa_num = input(gpa_char, informat.);
round 2
gpa_char
‘A-’
‘B+’
‘C’
‘B-’
‘B’
‘D’
gpa_num
3.7
3.3
2.0
2.7
3.0
1.0
custom informat: abc 123
round 2
gpa_char
‘A-’
‘B+’
‘C’
‘B-’
‘B’
‘D’
gpa_num
3.7
3.3
2.0
2.7
3.0
1.0
gpa_num = input(gpa_char, gpafmt.);
custom informat: abc 123
proc format;
invalue gpafmt ‘A+’ = 4.0
‘A’ = 4.0
‘A-’ = 3.7
‘B+’ = 3.3
‘B’ = 3.0
‘B-’ = 2.7
‘C+’ = 2.3
‘C’ = 2.0
‘D’ = 1.0
‘F’ = 0 ;
run;
new = input(old, custominfmt.) ;
round 2 custom informat: abc 123
Convert from char to num not just in type but also content.
Powerful for simplifying code.
❶ ❷
bonus round custom format: 123 abc ?
gpa_avg
3.50000
2.66667
2.31540
1.34500
3.95000
2.45150
...
gpa_letter
3.7
3.3
2.0
2.7
3.0
1.0
if 0 =< gpa_avg < 0.7 then gpa_letter = ‘F’ ;
else if 0.7 =< gpa_avg < 1.7 then gpa_letter = ‘D’ ;
else if 1.7 =< gpa_avg < 2.7 then gpa_letter = ‘C’ ;
else if 2.7 =< gpa_avg < 3.7 then gpa_letter = ‘B’ ;
else if 3.7 =< gpa_avg < 4.0 then gpa_letter = ‘A’ ;
else if gpa_avg = . then gpa_letter = ‘’ ;
bonus round custom format: 123 abc ?
proc format ;
value gpafmt 0 -< 0.7 = 'F'
0.7 -< 1.7 = 'D'
1.7 -< 2.7 = 'C'
2.7 -< 3.7 = 'B'
3.7 - 4.0 = 'A' ;
run ;
gpa_letter = put(gpa_avg, gpafmt.);
bonus round custom format: 123 abc
bonus round
gpa_avg
3.50000
2.66667
2.31540
1.34500
3.95000
2.45150
...
gpa_letter
3.7
3.3
2.0
2.7
3.0
1.0
custom format: 123 abc
bonus round
gpa_letter = put(gpa_avg, format.);
custom format: 123 abc
gpa_avg
3.50000
2.66667
2.31540
1.34500
3.95000
2.45150
...
gpa_letter
3.7
3.3
2.0
2.7
3.0
1.0
bonus round
gpa_letter = put(gpa_avg, format.);
custom format: 123 abc
gpa_avg
3.50000
2.66667
2.31540
1.34500
3.95000
2.45150
...
gpa_letter
3.7
3.3
2.0
2.7
3.0
1.0
proc format ;
value gpafmt 0 -< 0.7 = 'F'
0.7 -< 1.7 = 'D'
1.7 -< 2.7 = 'C'
2.7 -< 3.7 = 'B'
3.7 - 4.0 = 'A' ;
run ;
bonus round
gpa_letter = put(gpa_avg, gpafmt.);
custom format: 123 abc
gpa_avg
3.50000
2.66667
2.31540
1.34500
3.95000
2.45150
...
gpa_letter
3.7
3.3
2.0
2.7
3.0
1.0
proc format ;
value gpafmt 0 -< 0.7 = 'F'
0.7 -< 1.7 = 'D'
1.7 -< 2.7 = 'C'
2.7 -< 3.7 = 'B'
3.7 - 4.0 = 'A' ;
run ;
bonus round
gpa_avg
3.50000
2.66667
2.31540
1.34500
3.95000
2.45150
...
gpa_letter
‘B’
‘C’
‘C’
‘D’
‘A’
‘C’
...
gpa_letter = put(gpa_avg, gpafmt.);
custom format: 123 abc
proc format ;
value gpafmt 0 -< 0.7 = 'F'
0.7 -< 1.7 = 'D'
1.7 -< 2.7 = 'C'
2.7 -< 3.7 = 'B'
3.7 - 4.0 = 'A' ;
run ;
new = put(old, customfmt.) ;
Convert from num to char not just in type but also content.
Powerful for clarifying output.
❶ ❷
bonus round custom format: 123 abc
FOLD
TACK ENJOY
CONTACT
REFERENCES
Donna Chan
ext 8883
room 1864
1 – An Animated Guide: Using the Put and Input Functions | 2008
by Russ Lavery & Alejandro Jaramillo
2 – Using PROC FORMAT to Create Dynamic Lookups | 2012
by Jed Teres
3 – Five Things Every Presenter Should Know About People | 2012
by Brain Pickings
Top Related