本帖最后由 生统家园推荐 于 2010-8-27 14:34 编辑
初学SAS,请教各位高手一小问题,关于循环语句中读取数据文件,如下:
简单举例,假设我有4个TXT文件,每个文件中1个数值变量,共5个观测(如1 2 3 4 5),数据分析前,需要先用循环语句对这几个文件的数据预处理,
我现在的问题在于怎么用SAS语句读取文件,以前做的分析全用VB程序编的:
1.例如,VB语句可以这样写:
For i=1 to 4
open "E:\" & i & ".txt" for Input As 1
While Not EOF(1)
Input #1, b
a(m) = b
m = m + 1
Wend
Close 1
Next i
2.尝试用SAS语句:
data a;
do i=1 to 4 by 1;
infile "E:\" i ".txt";
end;
input v ;
run;
---------问题:SAS语句在“Infile”那行的“i”处提示错误,数据读不进去......请问SAS语句中有什么方法可以实现以上用途吗?
--------请各位高手不吝相助,不胜感激~~~
hopewell答案:
data temp;
do in=1 to 4;
fname=cats('d:\',in,'.txt');
do until(last);
infile XXX filevar=fname end=last;
input v;
output;
end;
end;
stop;
run;
此处注意几点:
1.DO循环:很巧妙的注意到了D盘下TXT文件名的规律性,都是一个数字命名的文件名,用变量IN,采用CATS字符串连接函数,循环创建D盘下的TXT文件名变量FNAME;
2.在读取文本数据时,很多人都知道用INFILE,以及INFILE基本参数,XXX是文件名,filevar是打开或者关闭指定的文件名,end=last是定义一个变量了解是否读到文件的结尾处,这里的LAST与until里面的last保持一致
3.STOP,这里为什么用STOP,这个很重要,如果你去掉STOP,那么你会发现无线循环下去。所以当我们在DATA步里面制定读取的数据是以随机方式读取的时候,例如这个里面的IN,或者是在SET里面的POINT等,需要用STOP。Because SAS does not detect an end-of-file with this access method, you must include program statements to prevent continuous processing of the DATA step.
在这里提出一个思路:我们在解决这类问题的时候,先考虑是一个文件的时候,你如何写程序,如何读取,如果是两个文件的时候,程序与读取一个文件时程序有什么不同,这种不同是什么原因导致,这个不同是否有规律可循,寻找到规律你就有思路了。
|