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;PROC IMPORT OUT= raw.&name
DATAFILE= csvfileDBMS=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;
/*(5). 建立本地資料夾,用於存放匯出後的檔案*/
%macro createrfolder(dir) ;
DATA _NULL_;
RC = SYSTEM('MKDIR'||' '||"&DIR");
PUT RC=;
RUN;
/*(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. 中文 變數名 無法匯入
********************************************************************/
----------------------------------------------------------------------------------------------------------------