sas输入输出数据的相关语句 output、 put、 remove、replace 、file 、infile
index: output put replace file infile
没人任何规定的输出语句,sas系统会输出pdv当前观测到主数据集原先的位置
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 ; run; 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=; run; proc print data=res noobs;
*由一个输入数据行输出多条观测;
data a; input id x1-x3; cards; 101 10 20 30 102 40 50 60 ; run; data b; set a; x = x1; output; x = x2; output; x = x3; output; output; run;
data c1 c2;*根据条件选择输出;
set sashelp.class;
if _n_ le 7 then output c1;
else output c2;
run;
*输出每个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 ; run; proc sort data=a;by x; run; data b; set a; by x; retain rt; if first.x then rt=0; 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 ; run; 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=; *命名方式输出,输出结果会带等号; run;
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;
do;
put firstname $10. @;
put ','@;
put id $3. @;
put ',' @;
put phonenumber 8.;
end;
run;
INFILE语句
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规定文件的逻辑记录长度,也就是一行的长度。