小编最近在潜心研究外部数据导入SAS,深感Excel的导入的不便利,想实现程序控制将Excel改为CSV在通过CSV导入SAS。想着想着,就想到用外部语言来实现文件的另存为的功能,开始呢,想用Excel中的VAB来实现,后来呢觉得SAS执行Excel里面Macro不太方便~因此就想用Python来实现。
说到Excel的Macro来另为CSV
请见下代码
/*可以实现的功能是将文件夹下所有的Excel都另存为CSV*/
Sub SaveToCSVs()
Dim fDir As String
Dim wB As Workbook
Dim wS As Worksheet
Dim fPath As String
Dim sPath As String
fPath = "填写路径"
sPath = " 填写路径"
fDir = Dir(fPath)
Do While (fDir <> "")
If Right(fDir, 4) = ".xls" Or Right(fDir, 5) = ".xlsx" Then
On Error Resume Next
Set wB = Workbooks.Open(fPath & fDir)
'MsgBox (wB.Name)
For Each wS In wB.Sheets
wS.SaveAs sPath & wB.Name & ".csv", xlCSV
Next wS
wB.Close False
Set wB = Nothing
End If
fDir = Dir
On Error GoTo 0
Loop
End Sub
下面还是回到SAS中来
01
前奏:SAS Check 某一文件是否存在
/*我这个Macro的功能呢:创建一个Macro Var ,如果某一路径下某一文件存在,则返回值1
如果不存在则返回0*/
%macro dde_file_yn(myfilerf);
%local _Localhave;
%if %sysfunc(fileexist(&myfilerf)) %then %do;
%put NOTE:The external file &myfilerf does exist.;
%let _Localhave=1;
%end;
%else %do;
%put NOTE:The external file &myfilerf does not exist.;
%let _Localhave=0;
%end;
&_Localhave.
%mend dde_file_yn;
02
开始本文重点了!重点!重点!(重要的事说三遍)
首先: Option选项;
options noxsync noxwait;/*控制DOS窗口不等待*/
%let path=填写路径你要转化Excel的位置;
data _null_;
if �e_file_yn(&path.xls2csvpy.py)=1 then do;
x "del
&path.xls2csvpy.py
";
run; /*本段代码实现的功能:检查制定文件夹,待产生的py文件是否存在,如果存在则利用X command 删除该文件,为什么要删除呢,因为我马上就要在产生一个这样的py程序*/
SAS生成Python程序
需要说明:小编用的是Python3.7
用到Python的包有:
pandas
openpyxl
xlwt
xlrd
如何安装: 安装好Python后,在CMD命令行中输出 Pip install pandas 等等..
扯远了,还是回到主题上,SAS生成Python代码
data _NULL_;
file "&path.xls2csv_py.py" encoding="utf-8" lrecl=30000; /*生成Python程序文件,设置编码*/
put "import pandas as pd";/*导入Pandas包*/
put "data_xls = pd.read_excel(r'&path.&csvname.','&sheetname.',index_col=0,header=0,skiprows=0)";
put "data_xls.to_csv(r'&path.&csvname..csv', encoding='gb2312')";/*输出CSV,以及设置编码*/
put "print(data_xls)";
run;
生成Python代码后,就可以准备调用和执行Python代码了
/*下面这段代码我个人觉得我好有成就感,为啥让我有成就感呢,因为利用SAS实现了一个延迟执行的效果: 怎么样一个延迟执行呢?由于前面的SAS执行生成Python文件是需要时间的去生成Python文件的,如果执行完上面的,立刻运行X Command执行Python文件可能会失败,因为Python文件还没有生成,为了解决这个问题,我引入了循环和最开始的�e_file_yn(check文件是否存在),如何文件没有生成则一直循环下,直到Check到Python文件生成了然后就调用X Command 执行Python语句。。(不要笑我,我的感点就是这么低)
如果各位看官还有更好的思路,希望可以和我讨论一下。。*/
data _null_;
if �e_file_yn(&path.xls2csv_py.py)=0 then ym=0;
do until (�e_file_yn(&path.xls2csv_py.py)=1);
put ym;
ym 1;
end;
x " %superq(path)xls2csv_py.py";
run;