请选择 进入手机版 | 继续访问电脑版

SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 5592|回复: 0

About Input Statement

[复制链接]

10

主题

39

帖子

777

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
777
QQ
发表于 2014-3-4 11:19:05 | 显示全部楼层 |阅读模式
(如果看不到图片,请登录后再试!)

大家好,今天跟大家分享一下用来导入外部数据的Input语句。该语句的使用率也是非常高的,我们平常使用SAS时,第一步要做的事情就是将数据导入SAS,之后才能做进一步的分析。如果在导入阶段将数据导入错误,则后面的分析工作就有问题了,因此正确的导入数据是非常重要的。

SAS官方将input语句分为4种使用方法:Column InputList InputFormatted InputNamed Input。一般情况下List InputFormatted Input方式是使用较多的,另外两种方式不是很常用,加上INPUT语句的一些option、控制符,可以很灵活的读取数据。下面就对这些内容一一进行介绍。




Column Input
    顾名思义就是按照列的方式读取数据,这种方式要求数据中每一列都是固定位置的。例如:第一个字段是第1-10列,第二个字段是第11-15列……,以此类推。这种数据格式目前不太常见,因为数据中将会包含大量的空格,这无形之中会增加数据的存储空间。假设现在有一个数据是如下格式:
                                    



可以看到数据中每个字段都是有自己的列范围,因此使用input语句读入时,采用以下格式:
  1. INPUT VisitingTeam $ 1-20 ConcessionSales 21-24 BleacherSales 25-28 OurHits 29-31 TheirHits 32-34 OurRuns 35-37 TheirRuns 38-40;
复制代码



List Input

此种读取方式就是逐个字段进行读取,但此种方式有较多限制:
  • 字段之间用空格分开;
  • 如有缺失值必须用“.”表示,无论是字符型还是数值型;
  • 字符型值中不能有空格;(如有空格则会识别为两个字段)
  • 字符型值不能超过8个字符;(多余的会被截取)

基于以上诸多限制,因此该种读取方法不常用。如果数据为以下所示形式,方可读取:
                             


读取语句:
  1. input  ToadName $ Weight Jump1 Jump2 Jump3;
复制代码
读取后数据:
                     

Formatted Input
     该种方式就是以指定的格式读取数据,此种方式也是比较常用的读取方式。像日期数据、时间数据、十六进制数据、以逗号分隔的数据等都是需要特定格式才能转化为数值型变量。例如:下面的数据中包括日期、逗号分割的数据、十六进制数据,这种包含特殊格式的数据,就必须采用该种方式读取。
                          
读取代码:
  1. input Name $17. Age 3. Type $2. Date MMDDYY10. num comma8. hex hex4.;
复制代码

                    

Named Input
此种读取方式适用于数据中包含字段名的,且是“字段名=字段值”这种格式的数据,例如如下数据:
                           


读取代码:
  1. input Name=$ Age=;
复制代码
此种方式几乎不用,反正目前我是没在实际工作中用过,因此大家了解以下即可。


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语句使用,但生成一条观测假设有以下数据形式:
                       

     该数据包含四个变量,numflagdaytime。要想正确的读入这4个变量,用trailing @即可完成。读取代码:
        
  1. 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语句使用,生成多条观测假设有以下数据形式:
                     

    该数据中只有两个变量:NameAge,多条数据在同一行,用double trailing @即可解决:
  1.          input name $ age @@;
复制代码
                     


  • @nmoves the pointer to column n.将当前的数据读取指针移到第n列。该控制符也是较常用的,可以跳过不需要的数据,也可以跳到第一列重新读取。假设有如下数据:
                  

     现只需要读取第一列和第三列,第二列数据无用无需读取。就可用@n跳过第二列:
  1.            input name $ @14 age;
复制代码
                  

  • @variable:与@n是一样的效果,只不过此处用一个变量代替数字,达到动态的作用。
  • @'character-string@character:也是类似的作用,将数据指针移动至指定字符串后的第一列。例如有数据:
               

      需要获取时间,以及文件路径,则用如下代码进行读取:(关于“:”修饰符,请参见后面说明
  1.             input @'[' dt anydtdtm19. @'GET' file : $20.;
复制代码
                  


  • +n+numeric-variable:将指针往后移动n列,或者是numeric-variable的取值所代表的列数。这个与@n的作用差不多,此处就不再举例了。

  • #n#numeric-variable:移动指针到第n行,或者numeric-variable的取值所代表的行数。
  • /:将指针移动到下一行,与上面的#n是类似的效果。例如,有如下形式数据:
                             


       每三行数据代表一条观测,则可以用如下代码读取:
  1.           input City $ State $ / NormalHigh NormalLow #3 RecordHigh RecordLow;
复制代码
                 


  • ?、??:在默认情况下,如果在input数据时,发现读取的数据无效时,SAS则会在日志当中进行提示,若使用了?或者??修饰符,则不会进行提示。?与??的区别就是,当遇到无效数据时,??修饰符会使得SAS不会将自动变量_ERROR_设置为1。例如有数据:

                                                               

     从中可以看到,第一行数据是错误的,出现了字符,以下是该修饰符的作用对比:
  1.          INPUT x 3.;
复制代码
                     


  1.          INPUT x ? 3.;
复制代码
                     


  1.          INPUT x ?? 3.;
复制代码
                     


  • :”该修饰符是非常有用的,尤其是在用Format Input读取数据的时候。在说@‘character的时候已经使用了该修饰符,大家可以回过头去看看那段程序。在这做一说明,如果不使用该修饰符即:
         
  1. input @'[' dt anydtdtm19.  @'GET' file $20.;
复制代码

     则file的值会出现错误,程序会读取20个字符,结果就像这样:
                           
      有了:修饰符,则程序会在碰到一个分隔符(空格)后停止继续读取,或者一直读够20个字符后停止继续读取。






Input语句差不多就是这些内容了,另外还有两个修饰符:&、~,这两个基本不会用到,因此也就不过多做介绍了,有兴趣可以去帮助文档看看。












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2021-7-30 06:25 , Processed in 0.180324 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表