31 %macro mp_ds2cards(base_ds=, tgt_ds=
32 ,cards_file=
"%sysfunc(pathname(work))/cardgen.sas"
40 %
if not %sysfunc(exist(&base_ds)) %then %
do;
41 %put WARNING: &base_ds does not exist;
45 %
if %index(&base_ds,.)=0 %then %let base_ds=WORK.&base_ds;
46 %
if (&tgt_ds = ) %then %let tgt_ds=&base_ds;
47 %
if %index(&tgt_ds,.)=0 %then %let tgt_ds=WORK.%scan(&base_ds,2,.);
48 %
if (
"&outencoding" ne
"") %then %let outencoding=encoding=
"&outencoding";
53 select count(*) into: nvars from dictionary.columns
54 where libname="%scan(%upcase(&base_ds),1)"
55 and memname="%scan(%upcase(&base_ds),2)";
56 %if &nvars=0 %then %do;
57 %put WARNING: Dataset &base_ds has no variables! It will not be converted.;
62 proc sort data=sashelp.vindex
63 (where=(upcase(libname)="%scan(%upcase(&base_ds),1)"
64 and upcase(memname)="%scan(%upcase(&base_ds),2)"))
71 set &syslast end=last;
72 if _n_=1 then call symputx('indexes','(index=(','l');
74 length vars $32767 nom uni $8;
76 if first.indxname then do;
82 else vars=catx(' ',vars,name);
83 if last.indxname then do;
84 if nomiss='yes' then nom='/nomiss';
85 if unique='yes' then uni='/unique';
86 call symputx('indexes'
87 ,catx(' ',symget('indexes'),indxname,'=(',vars,')',nom,uni)
90 if last then call symputx('indexes',cats(symget('indexes'),'))'),'l');
97 %if %datatyp(&maxobs)=NUMERIC %then %do;
101 create table &setds as select * from &base_ds
102 %if &random_sample=YES %then %do;
107 create table datalines1 as
108 select name,type,length,varnum,format,label from dictionary.columns
109 where libname="%upcase(%scan(&base_ds,1))"
110 and memname="%upcase(%scan(&base_ds,2))";
123 format dataline $32000.;
124 set datalines1 (where=(upcase(name) not in
125 ('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
126 if type='num' then dataline=
127 cats('ifc(
int(',name,')=',name,'
128 ,put(',name,',best32.-l)
129 ,substrn(put(',name,',bestd32.-l),1
130 ,findc(put(',name,',bestd32.-l),"0","TBK")))');
135 select dataline into: datalines separated by ',' from datalines_2;
142 %let process_dttm_flg = N;
143 %let valid_from_dttm_flg = N;
144 %let valid_to_dttm_flg = N;
148 if type='
char' then type2='$';
149 if strip(format) ne '' then format2=cats('format=',format);
150 if strip(label) ne '' then label2=cats('label=',quote(trim(label)));
151 str1=catx(' ',(put(name,$33.)||'length=')
152 ,put(cats(type2,length),$7.)||format2,label2);
156 if type='
char' then type3=':$char.';
157 str2=put(name,$33.)||type3;
160 if(upcase(name) = "PROCESSED_DTTM") then
161 call symputx("process_dttm_flg", "Y", "L");
162 if(upcase(name) = "VALID_FROM_DTTM") then
163 call symputx("valid_from_dttm_flg", "Y", "L");
164 if(upcase(name) = "VALID_TO_DTTM") then
165 call symputx("valid_to_dttm_flg", "Y", "L");
168 call symputx(cats("attrib_stmt_", put(_N_, 8.)), str1, "L");
169 call symputx(cats("input_stmt_", put(_N_, 8.))
170 , ifc(upcase(name) not in
171 ('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM'), str2, ""), "L");
175 file &cards_file. &outencoding lrecl=32767 termstr=nl;
176 length __attrib $32767;
183 put "data &tgt_ds &indexes;";
185 %do i = 1 %to &nvars;
186 __attrib=symget("attrib_stmt_&i");
191 %if &process_dttm_flg. eq Y %then %do;
192 put 'retain PROCESSED_DTTM %sysfunc(datetime());';
194 %if &valid_from_dttm_flg. eq Y %then %do;
195 put 'retain VALID_FROM_DTTM &low_date;';
197 %if &valid_to_dttm_flg. eq Y %then %do;
198 put 'retain VALID_TO_DTTM &high_date;';
201 put 'call missing(of _all_);';
206 put "infile cards dsd delimiter=',';";
208 %do i = 1 %to &nvars.;
209 %if(%length(&&input_stmt_&i..)) %then
210 put " &&input_stmt_&i..";
217 set &setds end=__lastobs nobs=__nobs;
219 format _numeric_ best30.29;
220 length __dataline $32767;
221 __dataline=catq('cqtmb',&datalines);
223 if __lastobs then do;
233 %if &showlog=YES %then %do;
235 infile &cards_file lrecl=32767;
241 %put NOTE: CARDS FILE SAVED IN:;
242 %put NOTE-;%put NOTE-;
243 %put NOTE- %sysfunc(dequote(&cards_file.));
244 %put NOTE-;%put NOTE-;