全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2464 7
2009-03-05
我用這個程序去跑資料~但是一直跑不完~跑到我硬碟沒空間就停了(空間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]
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-3-5 09:00:00

*************************;

   %MACRO DSPH(YEAR);

*************************;       

  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;

这里是个死循环。

把 OUTPUT; 放到后面应该就可以了。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-5 09:01:00
DO WHILE(WT>=CT_POT);

            TEMPWT=WT;

            WT=CT_POT;

          

            WT=TEMPWT-WT;

            DSP_HOU=DSP_HOU+1;

            IF DSP_HOU>&CLS THEN DO;

                DSP_HOU=&CLS;

            END;

           

              OUTPUT;

  

        END;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-5 14:54:00

我加上了OUTPUT;後跑的結果也是跑不完~可以請大大幫我跑跑看嗎?

我的  MSN:   calvin68919@hotmail.com    感謝~

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-6 03:24:00

楼主看的程序太深奥啦,在下深感佩服。

跟OUTPUT statement没有关系,最大的可能是CT_POT missing或极小,以至于您那个循环是子子孙孙无穷馈也(唉,可惜我没有儿子,这句话对我不成立)。您可以在一分钟后终止您的程序,打开名为OUT的dataset,看看SUMWT的值。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-3-6 09:48:00
There are few places that needs to look at.
1. Avoid use data=data, out=out, it is better to use another name for the dataset.
2. in the statements
        IF '31'<=AREA<='42' THEN AREA='22';
        IF '47'<=AREA<='57' THEN AREA='23';
AREA was input as a number. So try to remove the quotations, or input the AREA as Character variable
3. Try to input the CARD as character vraiable.
4. Cchange IF CARD=01     to     IF CARD='01'
5. Try  %let SSS=400 600;  instead of        %let SSS=%str(400 600);
6. The statement:      INFILE 'e:\Sample90.txt';   only input one file, not three files.
7. Try to convert macro variable CLS (and others macro variables
   in the condition statement)to number use PUT function.
   You have divided the CLS as character in the statement
         CT_POT=ROUND(SUMWT/&CLS);
   Although SAS may auto convert it to number.
9. It is easier to find something wrong if you can attach the datasets.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群