(如果看不到图片,请登录后再试!)
大家好,今天跟大家分享一下用来导入外部数据的Input语句。该语句的使用率也是非常高的,我们平常使用SAS时,第一步要做的事情就是将数据导入SAS,之后才能做进一步的分析。如果在导入阶段将数据导入错误,则后面的分析工作就有问题了,因此正确的导入数据是非常重要的。
SAS官方将input语句分为4种使用方法:Column Input、List Input、Formatted Input、Named Input。一般情况下List Input、Formatted Input方式是使用较多的,另外两种方式不是很常用,加上INPUT语句的一些option、控制符,可以很灵活的读取数据。下面就对这些内容一一进行介绍。
Column Input
顾名思义就是按照列的方式读取数据,这种方式要求数据中每一列都是固定位置的。例如:第一个字段是第1列-第10列,第二个字段是第11列-第15列……,以此类推。这种数据格式目前不太常见,因为数据中将会包含大量的空格,这无形之中会增加数据的存储空间。假设现在有一个数据是如下格式:
可以看到数据中每个字段都是有自己的列范围,因此使用input语句读入时,采用以下格式: - INPUT VisitingTeam $ 1-20 ConcessionSales 21-24 BleacherSales 25-28 OurHits 29-31 TheirHits 32-34 OurRuns 35-37 TheirRuns 38-40;
复制代码
此种读取方式就是逐个字段进行读取,但此种方式有较多限制:
基于以上诸多限制,因此该种读取方法不常用。如果数据为以下所示形式,方可读取:
读取语句:- input ToadName $ Weight Jump1 Jump2 Jump3;
复制代码 读取后数据:
Formatted Input
该种方式就是以指定的格式读取数据,此种方式也是比较常用的读取方式。像日期数据、时间数据、十六进制数据、以逗号分隔的数据等都是需要特定格式才能转化为数值型变量。例如:下面的数据中包括日期、逗号分割的数据、十六进制数据,这种包含特殊格式的数据,就必须采用该种方式读取。
读取代码:- input Name $17. Age 3. Type $2. Date MMDDYY10. num comma8. hex hex4.;
复制代码
Named Input
此种读取方式适用于数据中包含字段名的,且是“字段名=字段值”这种格式的数据,例如如下数据:
读取代码:此种方式几乎不用,反正目前我是没在实际工作中用过,因此大家了解以下即可。
Useful Options
介绍完最基本的读取方式后,接下来才是最有用的东西,各种Option。下面一一进行介绍:
- @:(Trailing @)Holds an input record for the execution of the next INPUT statement within the same iteration of the DATA Step. 即将当前INPUT语句所读取的观测给本次DATA步循环中的下一个INPUT语句使用,简而言之就是一条观测给两个INPUT语句使用,但生成一条观测。假设有以下数据形式:
该数据包含四个变量,num、flag、day、time。要想正确的读入这4个变量,用trailing @即可完成。读取代码:
- input num flag $ @; if flag='day' then input day mmddyy10.; else input time time8.;
复制代码
读取后的数据:
- @@:(Double Trailing @)Holds an input record for the execution of the next INPUT statement across iterations of the DATA step. 即将当前INPUT语句所读取的观测给下一个DATA步循环的INPUT语句使用,一条观测给多个INPUT语句使用,生成多条观测。假设有以下数据形式:
该数据中只有两个变量:Name、Age,多条数据在同一行,用double trailing @即可解决:
- @n:moves the pointer to column n.将当前的数据读取指针移到第n列。该控制符也是较常用的,可以跳过不需要的数据,也可以跳到第一列重新读取。假设有如下数据:
现只需要读取第一列和第三列,第二列数据无用无需读取。就可用@n跳过第二列:
- @variable:与@n是一样的效果,只不过此处用一个变量代替数字,达到动态的作用。
- @'character-string’、@character:也是类似的作用,将数据指针移动至指定字符串后的第一列。例如有数据:
需要获取时间,以及文件路径,则用如下代码进行读取:(关于“:”修饰符,请参见后面说明)
- input @'[' dt anydtdtm19. @'GET' file : $20.;
复制代码
- +n、+numeric-variable:将指针往后移动n列,或者是numeric-variable的取值所代表的列数。这个与@n的作用差不多,此处就不再举例了。
- #n、#numeric-variable:移动指针到第n行,或者numeric-variable的取值所代表的行数。
- /:将指针移动到下一行,与上面的#n是类似的效果。例如,有如下形式数据:
每三行数据代表一条观测,则可以用如下代码读取: - input City $ State $ / NormalHigh NormalLow #3 RecordHigh RecordLow;
复制代码
?、??:在默认情况下,如果在input数据时,发现读取的数据无效时,SAS则会在日志当中进行提示,若使用了?或者??修饰符,则不会进行提示。?与??的区别就是,当遇到无效数据时,??修饰符会使得SAS不会将自动变量_ERROR_设置为1。例如有数据:
从中可以看到,第一行数据是错误的,出现了字符,以下是该修饰符的作用对比:
- “:”该修饰符是非常有用的,尤其是在用Format Input读取数据的时候。在说@‘character’的时候已经使用了该修饰符,大家可以回过头去看看那段程序。在这做一说明,如果不使用该修饰符即:
- input @'[' dt anydtdtm19. @'GET' file $20.;
复制代码
则file的值会出现错误,程序会读取20个字符,结果就像这样:
有了:修饰符,则程序会在碰到一个分隔符(空格)后停止继续读取,或者一直读够20个字符后停止继续读取。
Input语句差不多就是这些内容了,另外还有两个修饰符:&、~,这两个基本不会用到,因此也就不过多做介绍了,有兴趣可以去帮助文档看看。
|