十:file语句
file中的option选项:
Dlm= 指定列表输出文件的分隔符,默认是空格
Dropover 规定当输出数据行长度超过指定值时,忽略超出部分
Flowover 规定当输出数据行长度超过指定值时,超过部分在下一行输出
Dsd 规定一个数据项可以包含分隔符,但是要用引号括住 默认分隔符是逗号
Encoding= 指定输出外部文件所用编码
Filename= 定义一个临时变量,用于接收put语句打开的文件名,默认长度为8
Filevar= 定义一个临时变量,file语句根据其值变化关闭当前输出文件并在下一次file语句执行时打开新的输出文件,长与input语句连用
Lrecl= 输出文件的逻辑记录长度
Mod 把输出行输出到文件中已经存在的行的后面
Old 替换文件原有的内容
eg:
filename file ‘f:\data_model\book_data\chapt3\utf.txt‘;
data _null_;
set sashelp.class;
file file encoding=‘utf-8‘;
put name weight;
run;
file语句最简单的形式,输出两个变量到新的文件中
eg2:
filename files ‘f:\data_model\book_data\chapt3\filename.txt‘;
data a;
length temp $50;
file files filename=temp;
put ‘abc‘;
fname=temp;
run;
输出两个文件,一个是sas数据集a,一个是文件文件filename.txt
其中数据集a中只有fname一个字段,其值为filename对应的文件名
put语句后面的内容为输出文件的内容,所以数据filename.txt中只有abc,
eg:
data b;
length name $200;
input name;
name=‘f:\data_model\book_data\chapt3\‘||strip(_infile_)||‘.txt‘;
file anyname filevar=name ;
date=date();
n=name;
format date yymmdd10.;
do;
put ‘test‘ @;
put ‘,‘ @;
put date ;
end;
cards;
test_file1
test_file2
test_file3
;
run;
解读:通过filevar选项的控制同时输出多个外部文件,并把外部文件名输出给sas数据集
蓝色部分为数据集b 的内容,黄色部分中put语句后面的为三个文件输出的内容;
cards读入数据后,自动变量_infile_都会自动获取相应的值,第一条记录读取时,test_file1被传送到_infile_变量中,从而filevar变量的值为f:\data_model\book_data\chapt3\test_file1.txt,然后赋值给n
如果仅仅是读取某一目录下所有外部文件名到另一个文本文件下,只需要如下代码。
data _null_;
do i=1 to 3;
length name $200;
name=‘f:\data_model\book_data\chapt3\‘||‘test_file‘||put(i,1.)||‘.txt‘;
file anyname filevar=name ;
file ‘f:\data_model\book_data\chapt3\fname.txt‘;
put name;
end ;
run;
商业实战:
输出定长文本文件
data _null_;
set sashelp.class(keep=name sex) nobs=obs end=last;
date=date();
file "f:\data_model\book_data\chapt3\test1.txt" dropover lrecl=32767 ;
if _n_=1 then
do;
put ‘header‘ @;
put date @; format date yymmdd10.;
put obs z8.;
end;
do;
put name $ 1-10 @;
put sex $ 15-16 ;
;
end;
if last then do;
put ‘end‘;
end;
run;
集中输出方式:
列方式输出:在put语句后要紧跟列号,对字符型要加$,如put
name $1-8
列表方式输出(自由格式):只是在put语句后列出变量名,当然字符型要外加$,如put
name $ age
格式化方式输出:在put语句后要指明输出格式,输出格式同事指明数据类型和列宽度,最后要加一个句点结尾。
如put name $8. age 4.
输出含有逗号不定长文本文件:
libname chapt3 ‘f:\data_model\book_data\chapt3‘;
data _null_;
set chapt3.file_put1;
file "f:\data_model\book_data\chapt3\test2.txt" dropover lrecl=32767 dsd dlm=",";
do;
put firstname @;
put id @;
put phonenumber ;
end;
run;
输出定长且含有逗号的文本文件
data _null_;
set chapt3.file_put2;
file "f:\data_model\book_data\chapt3\test2.txt" dropover lrecl=32767 ;
do;
put firstname $10. @;
put "," @;
put id $3. @;
put "