SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1804|回复: 12
打印 上一主题 下一主题

变量名称数值时,如何实现导入?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-1-21 16:41:24 | 只看该作者

变量名称数值时,如何实现导入?

文本格式的数据,变量名称为数值时,直接导入时自动把第一个字符替换为_,曾经尝试在import之前加上options VALIDVARNAME=ANY;还是没能如愿。手工在excell里面在前面加_,可是变量太多,excell又装不下,可能还会出错。有什么更好的办法来解决呢?
byes大师在线,可否给点建议?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-1-22 14:20:24 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-1-22 19:17:07 | 只看该作者

Re: 变量名称数值时,如何实现导入?

感谢byes,我试试。
同时预祝byes和所有论坛的朋友春节愉快!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-1-23 12:17:06 | 只看该作者

Re: 变量名称数值时,如何实现导入?

我尝试了一下,对以空格分隔的文件可以,可是我的文件是以tab分隔的,或者用“,”分隔时,相应的选项该怎么修改一下呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-1-23 14:23:57 | 只看该作者

Re: 变量名称数值时,如何实现导入?

直接可在上面的程序里面修改以下两个地方即可:(以逗号分隔符为例)
               delimiter=',';/*------------------逗号----------------*/
                           %let rc=%sysfunc(fsep(&fid,%str(,)));/*------------------逗号----------------*/
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-1-24 02:59:54 | 只看该作者

Re: 变量名称数值时,如何实现导入?

不需要那么多函数,如果您的文本件不那么太特别的话。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-1-29 09:20:35 | 只看该作者

Re: 变量名称数值时,如何实现导入?

多谢byes大哥和徐福贵,呵呵,两种方法处理空格和“,”分隔的文本时都很好啊,各有其妙啊,呵呵。当用tab分隔的文本时,dlm怎么设置呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-1-30 19:20:28 | 只看该作者

Re: 变量名称数值时,如何实现导入?

一样啊
dlm='09'x;
还有个%str(copy你的tab分隔符)
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-2-1 10:21:59 | 只看该作者

Re: 变量名称数值时,如何实现导入?

分别尝试了两种方法来处理我的文件(tab隔开的),仍然没有能够如愿。对byes的代码做了两处改动[delimiter='09'x;... %let rc=%sysfunc(fsep(&fid,%str(        )));],运行结果显示,不知道为何只把第一个变量rename为_,其他的变量为var2、var3、var4.......。而徐福贵的代码却仅仅把前面的48个变量正确rename,后面的却没有命名,不知道什么原因varnames的文件只能产生前面对应的48个变量,而我的文件则统一使用tab隔开的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-2-1 13:25:46 | 只看该作者

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]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 10:24 , Processed in 0.091418 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表