我用這個程序去跑資料~但是一直跑不完~跑到我硬碟沒空間就停了(空間75GB)~也沒跑成功~可以請高手大大看看是哪出問題了~麻煩了@@
************************;
%MACRO CD;
************************;
PROC SORT DATA=P1 ; BY FID; RUN;
PROC SORT DATA=DATA; BY FID; RUN;
PROC TRANSPOSE DATA=DATA PREFIX=I OUT=DATA;
ID ITM;
BY FID;
RUN;
DATA SOURCE;
MERGE DATA P1;
BY FID;
ARRAY NUM{*} _NUMERIC_;
DO X=1 TO DIM(NUM);
IF NUM{X}=. THEN NUM{X}=0;
END;
RETAIN DSP;
DSP=I400-I600;
PROC DATASETS;
DELETE DATA P1;
RUN;
%MEND CD;
*************************;
%MACRO DSPH(YEAR);
*************************;
PROC SORT DATA=SOURCE;
BY DSP;
RUN;
PROC SUMMARY DATA=SOURCE;
VAR DSP;
WEIGHT WT;
OUTPUT OUT=OUT SUM=SUMDSP SUMWGT=SUMWT;
DATA DSP_H&YEAR;
MERGE SOURCE OUT;
RETAIN CM_QTY SSUMWT CT_POT DSP_HOU;
IF _N_=1 THEN DO;
DSP_HOU=1;
CM_QTY=WT;
CT_POT=ROUND(SUMWT/&CLS);
SSUMWT=SUMWT;
END;
ELSE DO;
CM_QTY=CM_QTY+WT;
END;
IF CM_QTY<CT_POT*DSP_HOU THEN DO;
OUTPUT;
END;
IF CM_QTY=CT_POT*DSP_HOU THEN DO;
OUTPUT;
DSP_HOU=DSP_HOU+1;
IF DSP_HOU>&CLS THEN DO;
DSP_HOU=&CLS;
END;
END;
IF CM_QTY>CT_POT*DSP_HOU THEN DO;
IF _N_=1 THEN DO;
WT=CT_POT;
END;
ELSE DO;
WT=WT+(CT_POT*DSP_HOU)-CM_QTY;
END;
IF WT>0 THEN OUTPUT;
WT=CM_QTY-(CT_POT*DSP_HOU);
DSP_HOU=DSP_HOU+1;
IF DSP_HOU>&CLS THEN DO;
DSP_HOU=&CLS;
END;
DO WHILE(WT>=CT_POT);
TEMPWT=WT;
WT=CT_POT;
OUTPUT;
WT=TEMPWT-WT;
DSP_HOU=DSP_HOU+1;
IF DSP_HOU>&CLS THEN DO;
DSP_HOU=&CLS;
END;
END;
IF WT>0 THEN DO;
OUTPUT;
END;
END;
PROC DATASETS;
DELETE OUT SOURCE;
RUN;
%MEND DSPH;
*********************;
%MACRO FINAL(YEAR);
*********************;
PROC TABULATE DATA=DSP_H&YEAR FORMCHAR=' '
FORMAT=COMMA10.0 MISSING;
VAR DSP;
WEIGHT WT;
CLASS DSP_HOU;
TABLE DSP_HOU*DSP*MEAN;
%MEND FINAL;
****************************;
%MACRO INP_D(YEAR,H);
****************************;
TITLE " YEAR &YEAR ";
DATA P1 (KEEP=FID WT)
DATA (KEEP=FID ITM AMT)
;
INFILE 'e:\Sample90.txt'; (資料檔共有三個 sample90.txt lay90o.txt hdata90)
INPUT @1 AREA 2.
@79 CARD 2.
@;
IF '31'<=AREA<='42' THEN AREA='22'; /*台北市*/
IF '47'<=AREA<='57' THEN AREA='23'; /*高雄市*/
IF AREA=&H THEN DO;
IF CARD=01 THEN DO;
INPUT @1 FID $8.
@65 WT 14.8
@;
OUTPUT P1;
END;
IF 23<=CARD<=99 THEN DO;
INPUT @1 FID $8. @;
DO I= 1 TO 5;
INPUT ITM $3.
AMT ZD11. @;
IF ITM IN ( &SSS ) THEN OUTPUT DATA;
END;
END;
END;
TITLE &H;
%MEND INP_D;
*************************;
** MAIN PROGRAM **;
*************************;
dm 'log;clear;pgm;recall;';
OPTIONS NOCENTER NODATE LS=200 noxwait noxsync;;
%LET CLS=10;
%LET SSS=%STR(400 600);
%INP_D(90,’02’); RUN;
%CD ; RUN;
%DSPH(90); RUN;
%FINAL(90); RUN;
//
[em06]