SAS中文论坛

标题: 请问如何能够进行“程序外”的输入 [打印本页]

作者: shiyiming    时间: 2006-3-3 11:40
标题: 请问如何能够进行“程序外”的输入
请问macro可以让用户在运行SAS程序时,从某个interface进行输入,比如指定要打开的文件路径或给某个变量赋值?
作者: shiyiming    时间: 2006-3-5 21:14
标题: to maurice
当然可以,比如用SAS/AF,C,Java等等。
关键是你到底想干什么,需要把需求描述的详细些。
作者: shiyiming    时间: 2006-3-5 22:40
标题: to shiyiming
下面是我的一段程序:

libname PADS "E:\work\Phamarcokinetics Assay Data System";
PROC IMPORT OUT= work.ORIGINAL
            DATAFILE= "E:\work\Phamarcokinetics Assay Data System\miso20060104.txt" /*locate the file of the raw data*/

     DBMS=TAB REPLACE;
     GETNAMES=NO;
     DATAROW=18;

运行时每次import的文件名不同,因此需要都程序进行修改。我希望能让运行程序的人在程序外给这个文件指定路径,比如用一个popup。

此外,对于一些变量的负值我也希望以这种方式进行。

请问有什么办法吗?

我研究了一些SAS macro的reference 发现%input好像可以用,但是使用的时候却出了问题。我的程序如下:

%macro test;
%put Enter your first name:;
%input first;
%mend test;

data test;
%test
run;

还请指点!谢谢!
作者: shiyiming    时间: 2006-3-6 10:54
标题: to maurice
你先看看 <!-- m --><a class="postlink" href="http://support.sas.com/techsup/unotes/SN/001/001887.html">http://support.sas.com/techsup/unotes/S ... 01887.html</a><!-- m -->

如果交互性要求非常高,一般我们都用SAS/AF做个界面给用户。如果文件名有规律且交互性要求不是很高,可以用程序批量自动读取某目录下的文件名。
用%window也是一个方法。
作者: shiyiming    时间: 2006-3-6 11:21
标题: to shiyiming
真实有趣,这个宏竟然只能在program editor里运行,却不能在enhanced editor里运行。谢谢管理员!

我再研究研究AF吧。

请问EIS使用时,电脑让指定repository path是什么意思?
作者: shiyiming    时间: 2006-3-6 13:33
标题: to maurice
你可以按照这个方法扩充功能
[code:30898]filename getfiles pipe &quot;dir/b D&#58;\temp\*&#46;sas&quot;;
data filenams;
infile getfiles;
length filename $200;
input filename;
filename=upcase&#40;filename&#41;;
run;[/code:30898]
repository是定义和存储EIS的元数据的地方。我想这是另一个话题了,如果你想讨论,我建议还是另外发个帖子,这样别人能够更好的查找与支持。
作者: shiyiming    时间: 2006-3-8 13:01
标题: to Shiyiming
回到原来的话题。你的程序我还没有调试成功。不过,我不光需要让用户来指定flie path。更主要的是,我希望用户给变量赋值。如下面程序:

[code:2ccef]
   data test;
     LLOQ=40;
    run;
[/code:2ccef]

我希望用户能够在run这段程序时,给LLOQ赋值,而不是到程序中改。

我试验%input的时候,用户需要在program editor里赋值,我想让赋值能在一个单独的界面完成,哪怕是个简单的窗口。

%window我也试了试,但不知为何得不到window里输入的数值。

[code:2ccef]
%macro getLLOQ;                                                                                                                        
  %window dataentry color=white                                                                                                           
   #5 @28 'Enter the LLOQ&#58;' attr=highlight                                                                                             
      color=blue                                                                                                                        
   #6 @28 x 3                                                                                                                        
   ;                                                                                                                                 
  %display dataentry;
%mend getLLOQ;                                                                                                                          
data getLLOQ;                                                                                                                           
%getLLOQ
run;   
[/code:2ccef]
作者: shiyiming    时间: 2006-3-8 13:31
标题: to maurice
不晓得这样符合你的需求吗?其实你就差最后一步了。
[code:a0b18]data getLLOQ;
  %window dataentry color=white
   #5 @28 'Enter the LLOQ&#58;' attr=highlight color=blue
   #6 @28 x 3
   ;
  %display dataentry;
  x=&quot;&x&quot;;
run;[/code:a0b18]
作者: shiyiming    时间: 2006-3-8 13:55
标题: to Shiyiming
感谢感谢!

对了,你的论坛怎么过期了?有没有新的地址?
作者: shiyiming    时间: 2006-3-8 17:59
标题: to maurice
如果你是指 <!-- m --><a class="postlink" href="http://shiyiming.51.net">http://shiyiming.51.net</a><!-- m --> 的话,因为过期我已经把它搬到 <!-- m --><a class="postlink" href="http://shiyiming.mysas.net">http://shiyiming.mysas.net</a><!-- m --> 了。这样可以少付一点租费。多谢眷顾 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
作者: shiyiming    时间: 2006-3-13 15:50
标题: to shiyiming
对于你的这段程序我还是有些不明白

[code:a30f5]
filename getfiles pipe &quot;dir/b D&#58;\temp\*&#46;sas&quot;;
data filenams;
infile getfiles;
length filename $200;
input filename;
filename=upcase&#40;filename&#41;;
run;
[/code:a30f5]

程序将"dir/b D:\temp\*.sas"中的所有sas文件都读入filename数据集,那么它们是以什么样的形式合并的呢?

因为Pipe我不会用,所以不太明白你的第一句。
作者: shiyiming    时间: 2006-3-14 13:31
标题: to maurice
pipe是SAS新的管道功能,可以参见HELP。
这段程序是读入所有*.sas的文件名,输出到数据集filename。
你可以运行一下程序体会一下。
作者: shiyiming    时间: 2006-3-20 17:58
标题: to shiyiming
我现在想做这样一件事:
将"d:\temp"中的所有的txt文件导入到SAS当中,并去除其中的开头18行。
当只导入一个文件的时候,我用proc import完成的很好。多个文件的导入时,我想借鉴你写的程序,但是却不知如何将获取到的文件名应用在proc import中。我的文件是以tab为delimiter的。

以下是我写的一段程序,运行不通,但不明白为什么。

[code:da068]
filename getfiles pipe &quot;dir/b D&#58;\temp\*&#46;txt&quot;;
data test;
n=0;
infile getfiles
       end=done;
length filenames $ 200;
input filenames;
n=n+1;
call symput&#40;'x',n&#41;;
call symput&#40;'filename',filenames&#41;;
if done ne 0 then
proc import out=raw&x;
       DATAFILE = &quot;D&#58;\temp\&filename&quot;
           DBMS =tab replace;
         getnames=no;
         datarow=18;
run;
[/code:da068]
作者: shiyiming    时间: 2006-3-23 09:40
标题: 无意中的发现
无意中发现,其实直接在导入的path中写*.txt就行。
[code:22ba4]
PROC IMPORT OUT= import
            DATAFILE= &quot;E&#58;\temp\*&#46;txt&quot;
            DBMS=TAB REPLACE;
     GETNAMES=NO;
     DATAROW=18;
RUN;
[/code:22ba4]
SAS会将所有的txt文件存入一个数据集。
作者: shiyiming    时间: 2006-3-23 10:20
标题: to maurice
你的语法完全不正确,建议你要参加PROG1,PROG2和MACRO这么几门培训课程,否则你的编程效率不够高。要努力哦!
[code:bb8ed]%macro import_file;

filename getfiles pipe &quot;dir/b D&#58;\temp\*&#46;txt&quot;;

data filenames;
        infile getfiles;
        length filename $200;
        input filename;
        filename=upcase&#40;filename&#41;;
        call symput&#40;'obs', _n_&#41;;
run;

%do i=1 %to &obs;
        %let dsid=%sysfunc&#40;open&#40;filenames, i&#41;&#41;;
        %let rc=%sysfunc&#40;fetchobs&#40;&dsid, &i&#41;&#41;;
        %let filename=%sysfunc&#40;getvarc&#40;&dsid, %sysfunc&#40;varnum&#40;&dsid, filename&#41;&#41;&#41;&#41;;
        %let rc=%sysfunc&#40;close&#40;&dsid&#41;&#41;;

        proc import out=raw&i datafile=&quot;D&#58;\temp\&filename&quot; dbms=tab replace;
                getnames=no;
                datarow=18;
        run;
%end;

%mend import_file;

%import_file;[/code:bb8ed]
作者: shiyiming    时间: 2006-3-23 15:15
标题: to shiyiming
十分感谢你对我的帮助!
   的确,我的syntax非常差。我基本上是照着SAS9 的documentation遍的。
目前我在看the little sas book。至于培训,我觉得太贵了。今后争取让单位出钱供我去上课。
   再次感谢!




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2