SAS编程:如何批量读入某路径下外部文档数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAS编程:如何批量读入某路径下外部文档数据?相关的知识,希望对你有一定的参考价值。
参考技术ASAS日志文件的Issue检查涉及多个日志文件的导入,导入的过程分为2个部分。 第一部分,获取特定路径下所有日志文件的名称(即文件地址);第二部分,获取文件地址后将文件导入SAS数据集 。
这两部分功能的实现,之前都有过介绍:
这篇文章将这两部分的内容整合到一起,演示路径如下:
程序思路是,使用 Dopen 函数打开特定路径,通过 Dnum 函数获取路径内的文件数目,基于此使用Do循环以及 Dread 函数进行读取文件名称,路径名称与文件名拼接可以获得文件路径。最后,对数据集进行筛选,只保留.LOG文件。
程序运行结果如下:
前面文章介绍了2种导入方法,推荐使用 infile 语句。我手动将保存导入内容的长度设置为1000,这个值已经是比较大了。但是对于一些Log Issue,会将所有变量取值输出到日志中,这时候很容易造成内容截断。
不过,从检查Issue的角度看,可以在导入时筛选特定记录进行输出,截断不影响检查的判断结果。当然,也可以设置SAS读入文档的记录的最大长度32767,这大概率会避免内容的截断。
结果如下:
批量读入外部文档,是单个文档读入的延伸。文档读入SAS数据集,方便后续的检查处理。
感谢阅读, 欢迎关注!
若有疑问,欢迎评论交流!
SAS笔记 PDV与数据读入
其实我是不喜欢SAS的。当然,我不喜欢她,并不代表她不好,实际上在某些应用场景下SAS是款很优秀的软件。我的数据分析之路始于R,品尝过R的灵活与简洁(不论是软件安装还是语法)后,再来学习SAS,的确提不起兴致。然而由于:1.导师的项目数据量较大(几Gb到几十Gb);2.之前的项目代码师兄已经用SAS很优美地实现了;3.我莫名地当上了该项目负责人,要带着师弟师妹做该项目。我也只好硬着头皮学习SAS。奈何现在脑力大不如前,看的东西越来越记不住,于是下定决心梳理一下SAS相关知识。
1. DATA步简介
在SAS中,我们使用DATA步来读入数据,DATA步在读入数据时实际上有两个阶段:编译(compilation)和执行(execution)。过程如下:
- 在编译阶段中,逐个扫描语句,如果发现语法错误,SAS报错并终止运行;如果编译阶段中没有发现任何语法错误,进入执行阶段。
- 在执行过程中,DATA部读入第一条数据,在SAS中创建第一条观测;读入第二条数据,在SAS中创建第二条观测;读入第三条数据,在SAS中创建第三条观测……直至读入最后一条数据并在SAS中创建最后一条观测。我们可以把这个过程当做隐式循环(和DO,DO WHILE,DO UNTIL语句区分,它们是显示循环)。
需要注意的是,并不是DATA步中的所有语句都是在执行阶段运行,事实上,可以把DATA步语句分为两类:可执行语句(executable)和声明语句(declarative)。
声明语句只在编译阶段起作用,它可以放在DATA步的任何位置。下面是一些基本的DATA步声明语句:
LENGTH:设置内部变量长度
FORMAT:设置变量输出格式
LABEL:设置变量标签
DROP:指示输出文件中删掉哪些变量
KEEP:指示输出文件中包含哪些变量
与声明语句不同,可执行语句在DATA步中顺序很重要。比如从外部读取一个文本文件,我们必须以INFILE语句开始,告诉SAS从哪里读文件;然后输入INPUT语句,告诉SAS怎么读该文件。所以,INFILE语句必须在INPUT语句前面,顺序很重要。
2. DATA步的编译阶段(DATA Step Compilation Phase)
SAS从外部读入原始数据(raw data)时,会在编译阶段开始时创建一个输入缓冲区(input buffer)来存储raw data。如果是从外部直接读入SAS数据(.sas7bdat文件)则不会创建输入缓冲区。SAS在编译阶段还会创建PDV(program data vector),PDV其实就是内存中的一块区域,通过PDV将读入的raw data的每一条数据变成SAS数据集中的每一条观测。在PDV中有两个自动变量,_N_和_ERROR_。_N_=1表示正在创建第一条观测,_N_=2表示正在创建第二条观测,依次类推。_ERROR_只有0和1两个取值,等于0表示在创建当前观测时未发现错误,等于1表示在创建当前观测时发现错误。除了这两个自动变量外,PDV中还有DATA步在创建的数据变量。
假设在我们电脑D盘里有一个student.txt文件,内容如下(第一行红字表示每个字符的所占列位置编号,不是文档内容)
Barbara 61 12D John 62 175
现在我们用DATA步读入这个文件,并计算每个学生的BMI,看看PDV的工作原理。代码很简单:
data ex1; infile \'C:\\student.txt\'; input name $ 1-7 height 9-10 weight 12-14; BMI = 700*weight/(height*height); output; run;
- 一开始,PDV中只有_N_,_ERROR_这两个自动变量。
- 代码运行到 input name $ 1-7 height 9-10 weight 12-14;时,PDV中会按照input后变量的顺序创建NAME,HEIGHT,WEIGHT三个变量,D表示dropped,K表示kept。只有带K的变量才会output到数据集中。
- 代码运行到BMI = 700*weight/(height*height);时,PDV中创建BMI这个变量
在编译阶段,SAS会检查语法是否正确,在编译结束的时候,会创建SAS数据集的内容描述,包括数据集的名字,观测数,变量名,变量数目,变量类型,所有这些内容都可以通过CONTENTS输出。
3. DATA步的执行阶段(DATA Step Execution Phase)
- 在执行阶段的开始,自动变量_N_会被初始化1,自动变量_ERROR_被初始化0。一旦INFILE语句识别了我们待读取文件的路径,INPUT语句就会把待读取文件的第一条数据复制到输入缓冲区。
- 接着,我们的输入指针(input pointer,下图的红色箭头)会在(@)输入缓冲区的开始处。
- 然后,输入指针(红色箭头)会根据input语句定义的方式读入输入缓冲区的这条记录,并移动输入指针,在我们的例子中是将1-7列读入NAME,9-10列读入HEIGHT,12-14列读入WEIGHT,此时输入指针位于第15列。将记录写入到PDV,因为WEIGHT变量类型错误,所以WEIGHT变量值为空(.),同时_ERROR_会变为1,因为WEIGHT为空,所以BMI也为空。
- 然后执行OUTPUT语句,将PDV中的这条数据输出到我们的SAS数据集--WORK逻辑库中的ex1。到此student.txt中的第一条数据已读入SAS数据集。
- SAS返回到DATA步的第一条语句,也就是data ex1;开始读取student.txt中的第二条数据,此时_N_变为2,_ERROR_重新置为0,其余过程同上。如此往复,直至我们的输入指针遇到EOF(End Of the File),退出循环。DATA步结束。
在我们的这个例子中,如果我们不使用OUTPUT也可以读入该数据,这是因为在DATA步中,当用户没有显式指定OUTPUT时,SAS会隐式调用OUTPUT。不论显式还是隐式output,它们的作用都是讲PDV的那条数据output到我们的SAS数据集中。
以上是关于SAS编程:如何批量读入某路径下外部文档数据?的主要内容,如果未能解决你的问题,请参考以下文章