base SAS programming学习笔记(read raw files3)

使用LIST INPUT 来读入位置不固定的外部文件,如下所示:

1.LIST input格式

        INPUT variable <$> :$符合表示字符,variable是读入的变量名;默认的数值和字符长度为8;可以使用length 语句为字符变量设置长度,避免长于 8个字符的字符数据被截断;

        list input 需要数值与数值之间至少有一个空格或其他分隔符;

        数值必须是从左往右读入遇到分隔符结束读取该数据放入对应变量中;遇到下一个非分隔符开始新的变量数据读入;但不像column input和formatted input 一样,不能重复读入数值;

        如果是其他分隔符,需要在infile语句中加以使用DLM=“分隔符”选项;分隔符可以是引号引用的分隔符,也可以是字符变量。

举例如下:

        上述list input 读入的逻辑是sas会扫描输入列,第1列开始左往右读入第一个数据直到遇到",",逗号标志该数据读入结束,放入PDV的第一个变量中。

        variable可以是以序列形式存在;比如QES1-QES3;如果要给一串变量名加入格式的话,则该串变量名和格式比如用括号括起来,举例如下:

2.infile  语句选项 missover 

        如果input 行末有缺失值,在infile语句中加上missover,则SAS不会从下一行中读入数据来补上该行缺失。

举例如下:原数据

结果数据:

3.infile语句选项:DSD ,DLM="分隔符"

在infile语句中加入DSD选项,可以实现如下三个功能

a.默认分隔符为“,”

b.将连续两个分隔符视为缺失

c.将数据的引号剔除

如下所示:

如果不适用DSD选项,则连续两个分隔符视为1个,且不加missover会至下一行读取缺失的数值,读入完成即跳转至下一行从头开始读入:

举例如下:原数据:

如上所示,第二行数据的第一个值FEMALE用于填入第一行缺失的值,但是由于是字符格式不对视为缺失,且读入完成跳转至第三行,所以第二行数据FEMALE行则未读入。

4. list input语句中&和:的作用

      list input 时在变量名后加&表示在数据中有1个空格时不会结束读取,实现读入空格,只有当连续两个空格时结束读入,因此在变量名后加&符,则该变量与其他变量间必须用两个空格分开;且在informat格式前使用。

       list input时在变量名后加:支持读入非标准数据格式或者定义字符变量长度,遇到空格或其他分隔符的时候结束读入,按informat读入数据;

举例如下:

此处与formatted  input 不一致的是:formatted必须设置宽度,commaw.d来指定读入的列数,次数只需要输入comma.来读入非标准数值,:表示遇到分隔符结束读入数据。

&是在list input中使用;在格式前使用,表示可以允许数据中含有一个空格。后面的字符
长度并不是要读满12列,当碰到两个空格时即停止读入。

5.LIST PUT语句

        使用PUT语句可以将SAS数据集输出至外部文件,与LIST INPUT 语句类似

        PUT variable<:format> 

        variable表示变量名,:表示需要写入输出格式,format表示输出格式

举例如下:

LIST PUT的分隔符默认是空格,可以自定义输出外部文件的分隔符,在file语句中使用DLM="分隔符" ;也可以使用DSD选项,会将含有分隔符的数据加上引号

如下所示:

在PUT 语句中还可以直接将字符串和变量名一起写入外部文件,举例如下:

6.COLUMN INPUT\FORMATTED INPUT\LIST INPUT

        在实际应用中,可以将上述三种输入类型根据数据情况结合起来使用,举例如下:

源数据:

7.在读入数据时/和#的作用

         "/" 表示在上一个数据读入完成后,指针自动跳转至一下行,#n 上一个数据读入完成后指针跳转至第n行;举例如下:

8.在读入数据时“@”或者“@@”的作用

        @表示input 的变量名对应的数据读入完成后不执行换行,将指针保留在当前读入行;@@表示在一个data 步执行完成后也不换行,仍将指针保留在当前行。

        使用@或@@后的指针当遇到一行读入结束后实现换行或者执行完成后新的input语句后无 @或者@@符号。

使用@@符号举例如下,当遇到新的data步循环仍然保留在当前行

        举例如下:

结果示例如下:

使用@符号举例如下:

值得注意的是每次input sales 后加入一个 @符号,表示该input 语句完成后指针仍然保留在当前行,后面接了OUTPUT语句则是把当前PDV的数据输出至输出数据集,如果不加output语句则只会将最后一个input 输入的数值输出至输出数据集。一直到该次data步运行结束,指针自动跳转至下一行,重新开始读入ID,SALES变量。

上述程序可简化如下:

data  perm.sales97;

        infle date97l

        input ID $;

        do quarter =1 to 4;

                input sales :comma. @;

                output;

        end;

run;

第一次循环完成:

第二次循环完成:

结果如下:

如果数据不规整,如下所示,

        则可以在infile处使用missover 选项,该选项在一行结束如果还没有读入完成input 需要的变量时自动将剩余的变量附缺失值,而不跳转转至下一行读入input所需的变量数据,默认是如果input还有没填入完成的变量时则会自动跳转至下一行将下一行的数据填入input中缺失数据的变量中。

        该选项与TRUNCOVER选项相同,该选项则是使用column input或者formatted input对列数要求比较严格是,如果最末尾的变量数据包含的字符小于column input或者formated input时也不从下一行读入缺失的数据,在这一行读完即止。默认是column input或者formatted input 必须读入在input中提前规定的列数,如果没有则会从下一行读入。

        可借助while循环来读入不规整的数据

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值