output语句

TIPS

1:当output没有规定数据集名字时,把当前观测《 也就是一行数据 》输出到data步后面的所有数据集的末尾< 注意是所有数据集 >意味着纵向合并, 当规定数据集名字时,把pdv当前观测输出到output规定的数据集末尾。

2:在有 output语句和run语句同时 存在的data步里面, pdv只会执行output的结果到正在被创建的数据集,而执行run语句的结果是pdv会清空所有的变量为缺失

3:如果一个output语句出现在程序语句中间,无论有没有被执行,后面的语句都将继续被执行,但是不会输出结果到正在被创建的输出数据集,而是会持续清空pdv中所有变量值(使用retain性质的语句除外).

4:sas中有implicit output和explicit output,在每一轮data循环后,sas会默认的将pdv中的数据写入数据集,这就是implicit output,还有一类是用户明确写的output语句,也就是explicit output,当明确规定后,隐式的output就不会再执行了。

5:output是将数据输入数据集,put是将数据输入文件或日志

*需求:输出by组的最后一行观测值并将上一行的y值输出;
data a; input x y@@; cards;
1 10 1 20 1 200 2 30 2 40 3 50 3 60 4 70 3 80 4 400 proc sort data=a;by x;run; data res; set a; by x; retain rt; *如不用retain,下面的put能输出正确的值,但是运行到run后会自动清空,这样output的结果集中rt都会为缺失值; if first.x then rt=0; if last.x then output; rt = y; put rt=; proc print data=res noobs;
if last.x then output; rt = y; run;
/*读入第一条观测值时,rt被置为0,last.x为0不执行,rt=10,执行run,retain的rt保留在pdv中,因为output和run同时存在时run不会输出数据,只有output执行的时候rt才会被输出
,当读入第二条观测的时候output也不执行,但是这时的rt是保留的第二条观测值的y,当读入第三条观测的时候output执行,顺便输出pdv中的rt,这时的rt是倒数第二条观测值的rt,还没有进行赋值*/

remove语句

remove和delete和if子句都能起到获取部分数据集的效果,但是delete和if都perform only on physical但是remove既可以logical也可以physical,对于不同的引擎。

replace语句

REPLACE <data-set-name-1> <...data-set-name-n>;

如果不加则为输出pdv当前观测到数据集原先位置。该语句是系统的默认语句, 只能在modify语句中使用

使用replace-->>log日志:已更新数据集 WORK.STOCK。重写了 10 个观测,添加了 0 个观测,删除了 0 个观测。并不会添加或删除,只会重写

4:remove:当pdv输出当前观测到主数据集原先位置后,remove语句删除该观测值,该观测值可以使物理也可以是逻辑的

只能在modify语句中使用

自动变量_IORC_

当运行modify语句时,系统会自动创建一个_iorc_变量,其包含系统每次运行modify语句时返回的i/o操作码

以匹配访问为例:

如果主数据集by变量值在更新数据集中存在,则返回0

不存在,则不产生自动变量_iorc_

如果更新数据集by变量在主数据集中不存在,则返回一个非零值。

PUT输出(默认输出到log窗口)

data me;
    input x$ y z m n p q;
    cards;
    a 10 20 30 40 50 60
    b 70 80 90 100 110 120
data _null_;
    set me;
    put @2 x$ @;  *@2放在变量前表示从第二列开始输出 @在变量后表示数据指针继续停留在当前行输出;
    put +3 y 6-10 .2@; *+3表示变量y在x的3列后输出,这里用到了6-10的固定列输出方式,只是为了展示用,如果将6-10写成2-10则会发现覆盖掉了x的值, .2表示输出y时的表示方式有小数点后加2位小数;
    put +5 z: 10.2@; * :一定要写在 10.2前面,这表示去掉z与m之间多余的空格;
    put +5(m n p)(best10. "--" 4.2 "--" 4.2)@; *这里使用的是列表方式的数据 前面括号中的变量和后面括号中的格式一一对应 best10.是sas独有的输出方式,sas系统会以最列总数10的适合的方式输出m的值; 
    put +10 q=; *命名方式输出,输出结果会带等号;

file语句


filename Outfile 'C:\Users\Administrator\Desktop\sas-test\utf.txt';*定义输出的文件名和路径,本来打算用outputfile来定义filename的,结果编译失败,应该是名字过长的原因;
*filename只能定义一个输出文件;
data _null_;
set sashelp.class;
file Outfile encoding='utf-8'; *定义输出的编码格式;
put name weight; *file一般和put连用,put语句会把后面的变量put进文件中;
run;

data a;
length temp $50; *规定文件名长度,不然会输出过短,系统默认字符长度只有8位;
file Outfile filename=temp; *filename=选项获取文件名的字符串;
put 'abc'; *输出abc到outfile中;
fname = temp; *a只有一个变量,fname;
run;

*动态定义多个输出文件;
data me;
length name $200;
input name;

*其机制和set语句相同,input执行时,跳转到cards语句,按你定义的方式读取input后面的变量的值,这里是整行整行读取,读取玩一行后跳转到input的下一行;
name='C:\Users\Administrator\Desktop\sas-test\'||strip(_infile_)||'.txt';

/*_infile_和_N_一样是自动变量,可以认为后者是观测值序号,前者是观测值 _infile_是当前pdv中的所有值

In a DATA step, if the STRIP function returns a value to a variable that has

not previously been assigned a length, then that variable is given the length of the argument

说白了就是去前后空格的意思,好让文件名路径正确*/
file anyname filevar=name;
date =date();
n = name;
format date yymmdd10.;*固定date的输出格式;
do; *do end循环输出内容到文件中;
put 'test'@;
put ','@;
put date;
end;
cards;
test_file1
test_file2
test_file3
;
run;

/*输出数据集到文件,添加表头和尾,并规定输出格式*/ 

data _null_;

set sashelp.class(keep = name sex) nobs=obs end=last;
file 'C:\Users\Administrator\Desktop\sas-test\test.txt';
date = date();
if _n_ = 1 then
do;
put 'header '@;
put date @; format date yymmdd10.;
put obs z2.;
end;
do;
put name $ 1-10 @;
put sex 15-16;;
end;
if last then do;
put 'end';
end;
run;

data _null_;
set chapt3.file_put1;
file 'C:\Users\Administrator\Desktop\sas-test\test.txt' dropover lrecl=32767 dsd dlm=';'; *dlm选项是分隔符,代表输出文件用到的分隔符 dsd表示将变量本身包含的一些敏感符号用双引号括起来,以免和分隔符发生冲突;

*不定长输出;
do;
put firtname @;
put id @;
put phonenumber ;
end;

put firstname $10. @;

put ','@;

put id $3. @;

put ',' @;

put phonenumber 8.;

end;
run;

data a;
    infile datalines missover; *missover是缺失值的解决发难,会在相应的位置上打点;
    input x1-x4;    *infile中 dsd除了和file中的dsd意思一样还默认用逗号为分隔符;
    datalines;
    97.2 98.2  
    96.5 9 5 4
    4 2 41 5
run;

几个选项的解释 lrecl规定文件的逻辑记录长度,也就是一行的长度。