APP下载

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

2023-11-07张佳佳

电脑知识与技术 2023年26期
关键词:文件名数据文件文件夹

张佳佳

(对外经济贸易大学统计学院,北京 100029)

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: est_result中有一些Excel 文件,文件名未知,可以使用PIPE 功能得到该文件夹下所有的文件名。

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

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

图1 文件夹中的Excel文件

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

图2 DATA步读取文件名结果

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

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

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

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

图4 使用宏程序读入全部Excel文件

可以发现,不需要得到文件名,只需要知道文件存储的位置和文件的格式即可读取文件内容,即在一个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: est_01;

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

图5 X语句新建文件夹

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

X copy C:from*.*C: o*.*;

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

X“copy c:from*.*C: o*.*>C: eport.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所示。

图6 X语句前的处理日志

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

3 结论

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

猜你喜欢

文件名数据文件文件夹
文件名批量管理方法浅析
数据文件恢复专题问答
数据文件安全管控技术的研究与实现
SQL数据文件恢复工具
挂在墙上的文件夹
Tekla Structure数据文件交互格式分析
基于VC++6.0的文件名批量转换