新建文件夾;導出日志;導入、導出文件

新建文件夾

%sysexec md "G:\EC\KIE&month" & exit;
/***********************new folder*****************************************/

%let day=20991231;
data a;
newdirectory=dcreate(strip("&day."),"X:\BOBJ\Source\CACR\D16SRC");
newdirectory=dcreate(strip("&day."),"X:\BOBJ\Source\CACR\D16DB");
newdirectory=dcreate(strip("&day."),"X:\BOBJ\Source\CACR\DLM");
run;

記錄日志

DM 'LOG;log;FILE "P:\EC\data_summary\&month\summary.log" append;';  

/*****output log***/

dm 'LOG;file" C:\archive\mylog.log "';

/*****only output log to file***/

proc printto
  log="C:\archive\mylog.log" new; 
run;

/*********************** import & EXPORT (dde)**********************************/

dde export

%macro dde(excel=,sheet=,data=,r1=,r2=,c1=,c2=,out=);
    filename dde_out dde "Excel|[&excel..xlsb]&sheet!R&r1.C&c1.:R&r2.C&c2." notab lrecl=2048; 
    data _null_;
        set &data.;
        file dde_out dsd dlm='09'x ;
        put &out;
    run;
%mend;
%dde(excel=Channel Dashboard template_CN, sheet=Channels vs Txn Types, data=channel.channel_all_fin, r1=7,r2=22,c1=3,c2=10,out=Internet ATMON ATMOFF ATM Branch IVR Contact_Centre SMS);

%Macro Exl2DS(ExlFile=,outdat=,dbms=,getnames=,textsize=,sheet=);

    Proc import dbms = &dbms out = &outdat datafile = &ExlFile replace;
        getnames = &getnames;  /*導入源文件字段名作為SAS數據集的字段名*/
        scantext = Yes;       /*將源文件中各列值的最長長度作為該列在SAS中的字段長度。*/
        usedate = Yes;       /*對于包含日期字段的源文件字段,在SAS中只保留DATE值,并以DATE.格式存儲。*/
        scantime = Yes;     /*對于源文件中只有time值的列,自動以時間格式(TIME)存儲*/
        mixed = Yes;           /*若某一列中包含數值型和字符型變量,將數值型按照缺省值處理。若選的是YES則是將數值型轉換成字符型存儲,默認為NO*/
        textsize = &textsize;   /*源文件每一個單元格長度最大值*/
        sheet = "&sheet.";
    Run;
%mend Exl2DS;
%Macro DS2Exl(indat=,ExlFile=,sheet=);
    PROC EXPORT DATA= &indat.                       
     OUTFILE= &ExlFile.    
     DBMS=EXCEL2000 REPLACE;
     SHEET=&sheet.;
    run;
%Mend;

Proc Import:
datafile:要導入的文件
out:輸出的數據集
dbms:文件類型,可以是tab csv dlm excel2000等等
replace:是否替換已經存在的數據集
三個子句(其中delimiter只針對dbms=dlm的情況):
delimiter:制定分隔符
getnames:是否從文件首行讀入變量名
datarow:從那一行開始讀入數據
如:

proc import datafile='c:\test.csv' out=test dbms=dlm replace;
delimiter=',';
getnames=no;
datarow=2;
run;

proc export data= work.X_SELL_&day2.
 outfile= "X:\SAS_report\1401224\Monthly_013_CC_X_sell_report\Report\X_SELL_&day2..csv"    
 dbms=CSV replace;
run;

用SAS讀取外部數據(用data步導入自由格式的外部數據)
Data 數據集名;
Infile "路徑\表名" DLM=’characters’ <missover><firstobs=x>;
Input <@k> var1: format var2 <m-n> <@><@@></>; Run; ? Fileref: 導入文件路徑及名稱 ? DLM:分割符,默認為空格。 ? Missover:允許空值。 ? Firstobs:從第x行讀取數據 ? @k:從第k位開始讀數據。 ?:定義的變量為字符型。
? Format:定義變量格式。
? M-n:讀取m-n位。
? @:停頓符。
? @@:繼續讀取。
? /:換行符。
? DSD選項
注:
? 以從左到右的順序讀取數據。
? 所有變量默認長度為8位,如讀入數據超出8位,需在之前定義
例如:

data profile;
infile "E:\Vichy\Vichy_Profile.csv"  delimiter=',' dsd missover firstobs=2;
format   CustomerID $50.  Gender $11.  Mobile_Phone $20. ;
input   CustomerID $  Gender $   Mobile_Phone $  age;
run;
  1. 導出CSV:
proc export data=result 
                   outfile='D:\Lancome_ec\報表\sampler.csv'   dbms=csv replace;
run;
  1. 導入CSV:
%macro importcsv(dataset,path);
              proc import datafile=&path out=&dataset;run;
%mend;
%importcsv(dataset=listwave,path="D:\Lancome_ec\報表\listwave.csv");
  1. 導入excel:
方法1:
           PROC IMPORT OUT= WORK.recommend_rule
                          DATAFILE= "E:\EC\kie\ff-test\recommend_rule.xlsx"
                          DBMS=EXCEL REPLACE;
                          SHEET="Sheet1$";                  
                          GETNAMES=YES; /*指出第一行是否有字段名*/
                           MIXED=YES;/*同時讀入同一字段的字符型和數值型變量*/
             SCANTEXT=YES;/*會自動掃描,以最大的寬度作為改列字符變量的寬度。如果SCANTEXT=NO,則在不設定TEXTSIZE的情況下,默認長度為255。*/
           RUN;

方法2:
           libname lr "E:\Vichy\NPS_Mobile\薇姿1004_1010.xlsx";
           data nps_hcr;set lr."sheet1$"n;run;
           libname lr clear;
  1. 導出excel:
方法1:
           PROC EXPORT DATA=&input
                            OUTFILE= "E:\EC\kie\ff-test\result\&output..xls"
                            DBMS=EXCEL REPLACE label;
                            SHEET="sheet1";
            RUN;

方法2:
          libname lib excel "C:\Users\eve\Desktop\test\time_test.xlsx";
           proc datasets lib=lib kill;run;
           data lib.sheet1(dblabel=YES);set time;run; 
           libname lib clear;

/****************excel多表導出在同一工作簿中***************/

方法1:
%macro report(input,output);

PROC EXPORT DATA=&input
            OUTFILE= "E:\EC\kie\ff-test\定期項目\TMALL先試后買\Review\review&EC_date..xlsx"
            DBMS=EXCEL REPLACE label;
     SHEET="&output.";
RUN;

%mend;

%report(S2p_p2,先試后買推薦結果);
%report(P2p_p2,正裝推薦結果);
%report(Productnum,正裝回購人數);
%report(Samplenum,先試后買回購人數);
%report(p_time,正裝回購參考日期);
%report(s_time,先試后買回購參考日期);

方法2:
libname xlout excel "E:\EC\kie\ff-test\定期項目\TMALL先試后買\Review\review&EC_date..xlsx";
proc datasets lib=xlout kill;run;
data xlout.先試后買推薦結果;set  S2p_p2;run;
data xlout.正裝推薦結果;set P2p_p2;run;
data xlout.正裝回購人數;set Productnum;run;
data xlout.先試后買回購人數;set Samplenum;run;
data xlout.正裝回購參考日期;set p_time;run;
data xlout.先試后買回購參考日期(dblabel=yes);set s_time;run;/*輸出標簽*/

libname xlout clear;

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

  1. 輸出由freq出的類別的頻數和百分比構成的表
ods  csv file="G:\EC\KIE\online datamart\&date\datamart_對比.csv";
/*輸出datamart_對比表,總表中control和test包括以下6個量*/
proc freq data=t_test;table cluster;run;
proc freq data=c_control;table cluster;run;
proc freq data=t_test;table auscat;run;
proc freq data=c_control;table auscat;run;
proc freq data=t_test;table Frequency_online;run;
proc freq data=c_control;table Frequency_online;run;
ods csv close;

/***************導入外呼名單excel***************/

%let output=calllist;
%let path="E:\Vichy\Vichy Report\M89.xlsx";
%let sheet="data$"n;

%macro importexcel(dataset,sheet,path);

proc import    
out=&dataset   datafile=&path  dbms=excel replace;
sheet=&sheet;
GETNAMES=YES;
MIXED=YES;
SCANTEXT=YES;
USEDATE=NO;/* 使用日期格式變量*/
SCANTIME=YES;
RUN;

%mend;

%importexcel(dataset=&output,sheet=&sheet,path=&path);

/**********讀取外部原始數據**************/

1、讀取TXT文件

data TEMP; 
  infile  '/folders/myfolders/emp_data.txt'; 
  input empID empName $ Salary Dept $ DOJ date9. ;
  format DOJ date9.;
 run;
 PROC PRINT DATA=TEMP;
RUN;

2、讀取CSV文件

data TEMP; 
  infile  '/folders/myfolders/emp.csv' dlm=","; 
  input empID empName $ Salary Dept $ DOJ date9. ;
  format DOJ date9.;
 run;
 PROC PRINT DATA=TEMP;
RUN;

3、讀取Excel文件

FILENAME REFFILE
"/folders/myfolders/TutorialsPoint/emp.xls"
TERMSTR=CR;

PROC IMPORT DATAFILE=REFFILE
DBMS=XLS
OUT=WORK.IMPORT;
GETNAMES=YES;
RUN;
PROC PRINT DATA=WORK.IMPORT RUN;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容