使用SAS软件及PIPE功能批量处理数据方法研究

作者: 张佳佳

使用SAS软件及PIPE功能批量处理数据方法研究0

摘要:由于手动输入数据的过程费时费力,且近些年来越来越多的研究要求对大量数据进行处理,这些数据常常是在自动化的机器上产生,不仅文件数量庞大,而且时效性很强。该文提供了一种思路,通过使用SAS系统中的PIPE功能和X语句处理数据,此过程高度自动化且避免人为错误。

关键词: SAS;PIPE;批量处理;X语句

中图分类号:TP311        文献标识码:A

文章编号:1009-3044(2023)26-0073-03

开放科学(资源服务)标识码(OSID)

0 引言

有一批数据文件要被分析,已知文件地址和类型[1-2],可以使用PROC IMPORT或者在DATA步中使用INFILE语句来读入这些数据文件,但必须逐个读入,即使用宏语句批量读入也必须知道文件名[3-4]。但SAS也提供了其他工具来完成以上工作。例如PIPE是两个进程之间的通信通道,可以通过专门的应用程序向SAS会话提供信息。X语句可以在不关闭当前SAS进程的情况下提交DOS命令,且可以在DATA步之外运行。在SAS的传统应用场景中,先将数据手动输入Excel或TXT等文件中,然后传输、导入、分析以及输出[5-6]。但是,这样处理很难满足及时性的要求,且人工处理过程也很难避免出错 [7-8]。本研究根据实际使用场景需求,基于PIPE和X语句的功能特点,提供了一种新的思路对数据文件进行处理。

1 PIPE的应用

SAS是一种在学术界和工业界有巨大使用人群的分析工具,使用者常用它来处理分析数据、建立模型、质量管理及决策支援,甚至用于地理信息系统。SAS提供了多种工具帮助使用者处理文件或者与外部应用进行沟通。这是因为在真实研究中,我们面临的往往是多个数据来源、多个数据平台甚至多种数据类型,但是不需要每次都开发一套新的程序来满足不同数据的需求,SAS提供了多样化的工具来实现这一功能。多年来,SAS一直致力于简化与基本操作系统的接口提供函数、语句和其他元素,这是为了使用户不需要知道使用什么命令或如何使用,从而可以方便地把代码从一个平台移植到另一个。

PIPE是指在SAS中建立一种信息传输的管道,用于建立两种应用的连接。程序员常常使用这种功能在SAS程序中对外部的某个或某些文件进行操作,然后继续进行SAS程序的运行,不需要停止SAS程序。PIPE有两种形式,即:Unnamed PIPE和Named PIPE。后者主要处理SAS和其他软件间的信息交流,前者可以用来调用外部代码或在不创建中间文件情况下更改输入、输出、报错等信息。本文仅讨论第二种,如果对第一种形式的PIPE应用感兴趣可以参考SAS documentation。

以具体应用场景为例,如图1所示,D:\test_result中有一些Excel文件,文件名未知,可以使用PIPE功能得到该文件夹下所有的文件名。

首先使用filename语句建立pipe,如下:

filename rc pipe "dir D:\test_result\*.xlsx /b/s";

接着在DATA步中使用infile语句读取目标文件夹中的文件信息,然后使用变量res_file存放到数据集中,结果如图2所示。

data test1;

infile rc;

length res_file $200.;

input res_file;

run;

在第一行代码中,我们建立了一个管道,也就是PIPE,将目标文件夹与SAS连接,只读取其中的XLSX文件。Filename语句可以定义一个名字,用这个名字代替一个物理地址(当然也可以用宏变量),在接下来的语句中可以使用这个名字代表的物理地址,读取其中的文件。其中,dir是DOS命令,可以查看某目录下的文件,还可以查看文件的信息。*.xlsx使用了一个通配符,它可以代表所有的xlsx文件。\b \s都是dir命令的参数,\b只显示文件名, \s显示指定或当前目录下的所有文件。

PIPE与SAS宏的联用可以更加方便地处理数据文件。在上例中,我们得到了一个数据集,这个数据集中存放了所有将要处理的数据文件的名字,在下面的语句中可以将文件名赋值给一个宏变量。

%let filenm=test;

proc import out= &filenm. datafile="D:\test_result\&filenm..xlsx"

dbms=xlsx  replace;

run;

把刚才两个功能结合起来,可以实现在一个DATA步中得到所有待处理文件的文件名,接着在PROC步中读取文件,结果如图3所示。如果对这些待处理文件的处理方式是统一的,在后续的步骤中进行逐个处理即可,不过要在前两个步骤之间将每一个文件名都赋值给一个单独的宏变量。如果在宏语句中使用一个循环,则可以不必逐个将文件名赋值给宏变量。

data _null_;

set test1 end=last;

call symput("testfile"||strip(put(_n_, best.)), res_file);

filename=scan(scan(res_file, 3, "\"), 1, ".");

call symput("filename"||strip(put(_n_, best.)), filename);

if last then do;

call symput("numb", _n_);

end;

run;

将以上步骤嵌入宏程序运行结果,如图4所示。

可以发现,不需要得到文件名,只需要知道文件存储的位置和文件的格式即可读取文件内容,即在一个SAS程序中可以对一批文件进行同样处理。SAS不仅可以使用DOC命令,也可以使用Unix命令,这取决于SAS安装的机器本身的操作系统。

2 X语句

如果要在一个SAS对话中执行DOS命令,可以使用X语句。X语句就是以X开头的SAS语句,本质上是打开了CMD,然后打开应用或者对文件夹进行一定操作,也可以在SAS窗口环境中使用X命令。两者之间的主要区别是X语句像任何SAS语句一样提交。但是,X命令是作为窗口环境命令发出的。本节在示例中使用X语句,但是,这些信息也适用于X命令。

当提交X语句时,将临时退出SAS会话并获得对Windows命令处理器的访问权。X语句的语法如下:

X < 'command ' >;

2.1 使用X语句移动文件

X mkdir c:\test_01;

上例命令的作用是在C盘中建立一个新的文件夹test_01。如果将宏变量加入其中,则可以建立一个以日期为后缀的新文件夹,结果如图5所示。

data _null_;

a=strip(put(date(), date9.));

call symput("date", a);

run;

X mkdir c:\test_&date.;

这样操作可以将文件按照日期不同存储在不同的文件夹中。除此以外,还可以复制文件到目标文件夹。

X  copy C:\from\*.* C:\to\*.*;

此语句可以将C盘中from文件夹中的所有文件拷贝到to文件夹中。为了避免某个文件被其他用户使用导致无法被拷贝,在语句中加入另一个参数,指明输出SAS output的文件名,从该文件中可以查到是否所有文件都拷贝成功。即:

X “copy c:\from\*.* C:\to\*.* > C:\report.txt”;

同理,如果把copy换成move,就可以将拷贝改成移动。X语句不仅能在个人计算机上使用,如果能与服务器正确连接,还能对服务器上的文件操作,只不过需要对文件的位置进行正确描述。例如,面对一个LINUX管理的服务器可以使用如下语句:

X “copy /home/files/template.xlsx /home/files/output.xlsx”;

X语句可以采用不同的系统命令对目标文件实现复杂多样的操作,用户可以参考DOS命令获得更多了解。

2.2 使用X语句前的处理

为了防止在运行其他程序的时候产生错误,在使用X语句之前,应该先判断一个文件是否存在,然后再进行下一个步骤。如果被操作的文件不存在,在调用运行外部程序的时候会出错,导致整个SAS程序停止运行。

在判断文件是否存在时,可以使用DATA步,也可以使用宏语句。这里使用宏语句是为了对大量文件进行自动处理,而且还可以在log中生成对用户有用的警示信息,处理的日志如图6所示。

%macro fexist(myrf);

%if %sysfunc(fileexist(&myrf)) %then %do;

%put File &myrf exist.;

%end;

%else %do;

%put Warning: File &myrf does not exist.;

%end;

%mend fexist [9-11];

一般情况下,在对文件进行处理前首先判断文件是否存在宏程序中的常见操作。日常工作中当用户面对大量文件的时候,有时候并不知道将要处理的文件是否存在,即便是对将要处理的文件夹提前处理,挑选出要处理的文件,这一步骤也不会省略。这是因为在服务器上的一个文件夹往往有多个用户,如果文件已经被其他用户移动,提前判断文件是否存在即可避免SAS程序意外终止。X语句还可以使用XWAIT/NOXWAIT, XSYNC/NOXSYNC等选项控制程序执行的时间,发现错误,SAS会赋值给系统宏变量SYSRC[10-11]。

3 结论

SAS拥有强大的数据分析的能力,但在日常工作中,分析之前的数据处理往往会占用更多的时间。在对这些文件进行处理时,又必须将其保存在其他文件夹下用于后续分析、比较以及可能的追溯。在进行分析时,还必须准确地定位这些数据文件,甚至要根据数据进行不同分析[4,7]。如果人为控制这些过程,必然耗费大量时间,而且难以避免错误。使用PIPE功能可以自动定位查找将要分析的数据文件,如果结合宏的功能,还可以动态地处理数据文件,这一过程可以极大地提高效率。同时,X语句可以提交DOS命令对文件或应用进行操作,只需打开SAS程序,点击运行即可完成所有的操作,不需要中途退出。对于不熟悉SAS编程的人来说,仅仅需要修改一些文件地址就可以使用已经模块化的程序。

参考文献:

[1] 马文文.基于SAS模型的物流企业财务分析[J].合作经济与科技,2022(1):150-152.

[2] 肖媛媛,李晓梅,何利平,等.连续型变量界值点敏感度分析的SAS宏程序[J].中国卫生统计,2021,38(6):936-938.

[3] 孟娜,张糈,胡建华.生物等效性试验中药代动力学报表自动输出的SAS实现[J].中国医药科学,2021,11(22):216-218,222.

[4] 王嘉琳,金宇悦,李志刚.基于SAS-DBEN的海洋环境多因素预测方法[J].电脑知识与技术(学术版),2021(22):1-2,19.

[5] 陈卫中,魏敏,陈朝琼.线性回归模型在等效性、非劣效性中的应用及其SAS实现[J].中国卫生统计,2010,27(3):253-254,257.

[6] Xuelin FU,Junyong HU,Yajing CHEN,et,al.Process of Analyzing Pig Inbreeding Coefficient Using SAS Program[J].Agricultural Biotechnology,2021,10(3):59-62+86.

[7] 郑力嘉.Excel和SAS在生物统计学的应用对比分析[J].技术与市场,2021,28(6):147-148.

[8] 官晓风.区块链技术在商业银行应收账款管理中的应用——以平安银行SAS平台为例[J].会计之友,2021(12):153-158.

[9] David B Horvath.UNIX X Command Tips and Tricks[J].SESUG, 2019:1-5.

[10] Emily K Q Sisson.File Management Using Pipes and X Commands in SAS[J].WUSS, 2016:1-9.

[11] Ranganath Bandi, Harini Kunduru.Better Ways to Speak to Your System Using SAS: Automate Routine Tasks by using X, SYSTASK & FILENAME[J].PharmaSUG, 2011:1-10.

【通联编辑:代影】

上一篇 点击页面呼出菜单 下一篇