SAS中文论坛
标题:
变量名称数值时,如何实现导入?
[打印本页]
作者:
shiyiming
时间:
2009-1-21 16:41
标题:
变量名称数值时,如何实现导入?
文本格式的数据,变量名称为数值时,直接导入时自动把第一个字符替换为_,曾经尝试在import之前加上options VALIDVARNAME=ANY;还是没能如愿。手工在excell里面在前面加_,可是变量太多,excell又装不下,可能还会出错。有什么更好的办法来解决呢?
byes大师在线,可否给点建议?
作者:
shiyiming
时间:
2009-1-22 14:20
标题:
Re: 变量名称数值时,如何实现导入?
[code:ukb99m9s]/*兄弟:为你量身定做了一个:以空格为分隔符的txt文件,file为文件,out为导入后生成的数据集,prefix为变量名前缀*/
%macro a(file,out,prefix);
proc import datafile="&file" out=&out dbms=dlm replace;
delimiter='';
getnames=no;
datarow=2;
run;
filename aa "&file";
%let dsid=%sysfunc(open(&out));
%let nvar=%sysfunc(attrn(&dsid,nvars));
%let fid=%sysfunc(fopen(aa));
%let rc=%sysfunc(fsep(&fid,%str( )));
%let rc=%sysfunc(frewind(&fid));
%let rc=%sysfunc(fread(&fid));
%let rename=rename;
%do i=1 %to &nvar;
%let oldName=%sysfunc(varname(&dsid,&i));
%let rc=%sysfunc(fget(&fid,newName));
%let rename=%str(&rename &oldName=&preFix&newName);
%end;
%let rc=%sysfunc(close(&dsid));
%let rc=%sysfunc(fclose(&fid));
filename aa clear;
%let strLib=%scan(&out,1,%str(.));
%let strTable=%scan(&out,2,%str(.));
%if &strTable= %then %do;
%let strTable=&strLib;
%let strLib=WORK;
%end;
proc datasets lib=&strLib nolist memtype=data;
modify &strTable;
&rename;
quit;
%mend;
%a(c:\test.txt,result,_);[/code:ukb99m9s]
作者:
shiyiming
时间:
2009-1-22 19:17
标题:
Re: 变量名称数值时,如何实现导入?
感谢byes,我试试。
同时预祝byes和所有论坛的朋友春节愉快!
作者:
shiyiming
时间:
2009-1-23 12:17
标题:
Re: 变量名称数值时,如何实现导入?
我尝试了一下,对以空格分隔的文件可以,可是我的文件是以tab分隔的,或者用“,”分隔时,相应的选项该怎么修改一下呢?
作者:
shiyiming
时间:
2009-1-23 14:23
标题:
Re: 变量名称数值时,如何实现导入?
直接可在上面的程序里面修改以下两个地方即可:(以逗号分隔符为例)
delimiter=',';/*------------------逗号----------------*/
%let rc=%sysfunc(fsep(&fid,%str(,)));/*------------------逗号----------------*/
作者:
shiyiming
时间:
2009-1-24 02:59
标题:
Re: 变量名称数值时,如何实现导入?
不需要那么多函数,如果您的文本件不那么太特别的话。
作者:
shiyiming
时间:
2009-1-29 09:20
标题:
Re: 变量名称数值时,如何实现导入?
多谢byes大哥和徐福贵,呵呵,两种方法处理空格和“,”分隔的文本时都很好啊,各有其妙啊,呵呵。当用tab分隔的文本时,dlm怎么设置呢?
作者:
shiyiming
时间:
2009-1-30 19:20
标题:
Re: 变量名称数值时,如何实现导入?
一样啊
dlm='09'x;
还有个%str(copy你的tab分隔符)
作者:
shiyiming
时间:
2009-2-1 10:21
标题:
Re: 变量名称数值时,如何实现导入?
分别尝试了两种方法来处理我的文件(tab隔开的),仍然没有能够如愿。对byes的代码做了两处改动[delimiter='09'x;... %let rc=%sysfunc(fsep(&fid,%str( )));],运行结果显示,不知道为何只把第一个变量rename为_,其他的变量为var2、var3、var4.......。而徐福贵的代码却仅仅把前面的48个变量正确rename,后面的却没有命名,不知道什么原因varnames的文件只能产生前面对应的48个变量,而我的文件则统一使用tab隔开的。
作者:
shiyiming
时间:
2009-2-1 13:25
标题:
Re: 变量名称数值时,如何实现导入?
在宏里面怎么应用tab分隔符,我还真想不出办法来。希望大家可以帮助一起来探讨。
现在我只能换种不伦不类的方法解决你的tab问题
[code:1no6oms5]
/*以TAB为分隔符的txt文件,file为文件,out为导入后生成的数据集,prefix为变量名前缀*/
%macro a(file,out,prefix,dlm);
proc import datafile="&file" out=&out dbms=dlm replace;
delimiter='09'x;
getnames=no;
datarow=2;
run;
data _null_;
infile "&file" lrecl=32767 _infile_=a firstobs=1 obs=1;
input;
call symputx('var',a);
run;
%let dsid=%sysfunc(open(&out));
%let nvar=%sysfunc(attrn(&dsid,nvars));
%let rename=rename;
%do i=1 %to &nvar;
%let oldName=%sysfunc(varname(&dsid,&i));
%let newName=%scan(&var,&i);
%let rename=%str(&rename &oldName=&preFix&newName);
%end;
%let rc=%sysfunc(close(&dsid));
%let strLib=%scan(&out,1,%str(.));
%let strTable=%scan(&out,2,%str(.));
%if &strTable= %then %do;
%let strTable=&strLib;
%let strLib=WORK;
%end;
proc datasets lib=&strLib nolist memtype=data;
modify &strTable;
&rename;
quit;
%mend;
%a(c:\test.txt,result,_);
[/code:1no6oms5]
作者:
shiyiming
时间:
2009-2-1 16:40
标题:
Re: 变量名称数值时,如何实现导入?
运行结果是令人满意的!
作者:
shiyiming
时间:
2009-2-4 07:04
标题:
Re: 变量名称数值时,如何实现导入?
byes,好揶
作者:
shiyiming
时间:
2009-2-4 08:49
标题:
Re: 变量名称数值时,如何实现导入?
多谢徐福贵,让byes的代码看起来更加端正了,呵呵
欢迎光临 SAS中文论坛 (https://mysas.net/forum/)
Powered by Discuz! X3.2