SAS X Command Execute Python Code

2019-10-21 17:11:31 浏览数 (1)

02

小编最近在潜心研究外部数据导入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;

0 人点赞