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