1. 程式人生 > >csv轉.sas7bdat 格式批處理(包含cmd/bat執行)

csv轉.sas7bdat 格式批處理(包含cmd/bat執行)

-1- 新建一個 run.bat檔案------寫入以下程式碼

set Loc_Sas="E:\Program Files\SASHome\SASFoundation\9.4\sas.exe"         

set Loc_Cfg="E:\Program Files\SASHome\SASFoundation\9.4\nls\zh\sasv9.cfg"

set Loc_Prg=E:\file\csv2sas.sas

start/min "Run PGM"   %Loc_Sas%  -config %Loc_Cfg% -SYSIN  %Loc_Prg% 

pause

rem   start命令用於呼叫外部程式,min開始最小化視窗,loc_Sas: 指定sas啟動路徑,

rem  -config 指定sas 內部配置檔案: sasv9.cfg 該檔案指明瞭啟動載入的一些jar包,開啟jvm等

rem  -sysin   指定 需要批量執行的sas程式路徑


-2- 新建一個 csv2sas.sas檔案-----寫入以下程式碼

/*(1). option noxsync X命令後控制權返回sas,noxwait立即執行x命令xmin最小化視窗

 */

OPTIONS NOXSYNC NOXWAIT XMIN;   

/*(2).需要轉換的.csv檔案放置在本地"E盤" datasource中 */

x "dir E:\datasource\*.csv /b > E:\datasource\title";

/*(3) .編寫一個名為 setsas的巨集, 用import 方法匯入csv */ 

%macro setsas(name,dir) ;

    Filename csvfile  "&DIR.\&NAME..CSV"  termstr = CRLF;
  /*termstr=CRLF,指定回車為末尾符,解決變數數值中存在換行符問題*/

    PROC IMPORT OUT= raw.&name

         DATAFILE= csvfile
            DBMS=csv;
            REPLACE;
    GETNAMES=YES;              /*如果Getnames=Yes, 預設csv首行為變數名*/
    DATAROW=1;                   /*如果Getnames=no, 需datarow>=2*/

            GUESSINGROWS=10000;   /* 預設根據前20行來判斷,資料量大存在較長字元,gussingrows為根據實際情況填寫,避免字元截斷*/

        RUN;
%mend;

 /*(4).  編寫一個名為csv2sas 的巨集,呼叫setsas,將csv批量轉為sas*/

%macro csv2sas(dir,out) ;

      LIBNAME RAW "&out";
      DATA _NULL_;
         INFILE "&DIR.\ALL";
         INPUT STR: $200.;
CALL EXECUTE(COMPRESS('%SETSAS('||SCAN(STR,1,'.')||','||"&DIR"||');'));  
      RUN;

%mend ;

/*(5).  建立本地資料夾,用於存放匯出後的檔案*/

 %macro createrfolder(dir)  ;

        DATA _NULL_;                          
  RC = SYSTEM('MKDIR'||' '||"&DIR"); 
  PUT RC=;
       RUN;

 %mend ;

/*(6).  方法組合,傳入引數,實現csv轉.sas7bdat批量處理*/

 %macro drive(folder=,outfolder=);
            %local in out;
            %let  in= &folder;
            %LET out= &outfolder;
            %createfolder(&out);
            data _null_;
                       CALL EXECUTE(COMPRESS('%csv2sas('||"&in"||','||"&DIR"||');'));
            run;
            LIBNAME RAW CLEAR;

 %mend ;

/*(7) . 呼叫巨集*/

/* folder=( csv原檔案路徑),outfolder=(匯出的sas檔案路徑)*/

%drive(folder=E:\datasource,outfolder=E:\raw);


/* (8). 遇到的問題 ****************************************************

%macro setsas(name,dir) 存在的問題:

1.  這個巨集是使用 import 匯入 csv 資料;如果 csv中存在某一列資料(均以0開頭的數值型),匯入的時候0會匯入失敗。

     處理方式: (1)  在該列資料0前 加英文引號(')     ;

                       (2) 將 改列資料均變為文字;

                       (3)  不使用 import來匯入,使用infile  input 後format

2.  中文 變數名 無法匯入

   ********************************************************************/

----------------------------------------------------------------------------------------------------------------