SAS中文论坛

标题: 又遇到难题了,请高手们支招啊 [打印本页]

作者: shiyiming    时间: 2010-5-25 17:05
标题: 又遇到难题了,请高手们支招啊
有一些文件,里面的数据如下面形式
aa[color=#FF0000:jpe4ge3i]1[/color:jpe4ge3i]bbcc[color=#FF0000:jpe4ge3i]2[/color:jpe4ge3i]ddeeffgghh
aa[color=#FF0000:jpe4ge3i]2[/color:jpe4ge3i]bbccmmnn[color=#FF0000:jpe4ge3i]3[/color:jpe4ge3i]ddeeffggiijjhh
....
....
....
....

第一个field 是固定为aa,但是有几个field (暂时取名为name , team, score,no) 需要根据它前面那个变量的值(F2 and F4)来决定重复读取几次,读取长度都是2(如上面数据红色的field,2 就表示重复读取2次,取名为name_1&team_1,name_2&team_2...),最后一个field 固定为hh

结果应该如下:
[code:jpe4ge3i]F1     F2     name_1   team_1   name_2   team_2   F4    score_1  no_1   score_2   no_2    score_3   no_3  text
aa     1      bb       cc                         2     dd       ee     ff        gg                       hh
aa     2      bb       cc       mm       nn       3     dd       ee     ff        gg      ii        jj     hh[/code:jpe4ge3i]
我说清楚了吗?这个问题我觉得挺难的,请问有什么比较好的做法吗?谢谢各位
作者: shiyiming    时间: 2010-5-25 22:17
标题: Re: 又遇到难题了,请高手们支招啊...
先瞎写一个,变量名就凑合那样吧
[code:3k7gfkfy]filename benzon 'c:\benzon.txt';
data _null_;
        infile benzon end=last;
        input;
        max_f2=max(max_f2,length(scan(_infile_,2,'0123456789')));
        max_f4=max(max_f4,length(scan(_infile_,3,'0123456789')));
        if last then do;
                call symputx('max_f2',max_f2/2);
                call symputx('max_f4',max_f4/2-1);
        end;
run;
data raw;
        infile benzon;
        input @;
        _infile_='aa'||put(length(scan(_infile_,2,'0123456789'))/2,2.)||
                        put(scan(_infile_,2,'0123456789'),$%eval(&max_f2*2).)||
                        put(length(scan(_infile_,3,'0123456789'))/2-1,2.)||
                        put(substr(scan(_infile_,3,'0123456789'),1,length(scan(_infile_,3,'0123456789'))-2),$%eval(&max_f4*2).)||
                        'hh';
        input F1 $2. F2 2. (X_1-X_&max_f2) ($2.) F4 2. (Y_1-Y_&max_f4) ($2.) Text $2.;
run;[/code:3k7gfkfy]
作者: shiyiming    时间: 2010-5-25 23:53
标题: Re: 又遇到难题了,请高手们支招啊...
谢谢hopewell啊,其实我的重复次数可以是超过10次的,而且其中有些field也是数字型,我只列了部分字符型的出来,这可怎么办呢?我觉得是不是用DO循环来做比较方便点呢?
作者: shiyiming    时间: 2010-5-26 10:38
标题: Re: 又遇到难题了,请高手们支招啊...
我把我自己写的程序贴上来,大家帮我找找问题啊

但是在do循环里面,变量i,j 可以自增,但是不能创建变量F6_1,F7_1,F6_2,F7_2,到底哪里有问题啊?疯了我
作者: shiyiming    时间: 2010-5-26 12:47
标题: Re: 又遇到难题了,请高手们支招啊...
做为do loop计数变量的data set variable i和macro variable i是相互独立的,不是同一个东西. 通过input当前obsversation获得f2和f4值的时候已经是执行阶段了,而在此前的编译阶段,宏变量i和j的值就已经被确定下来了.
[code:1ylqnnv4]filename benzon 'c:\benzon.txt';
%macro varlist(type,value);
        %let input=;
        %do i=1 %to &value;
                %if &type=f2 %then %let input=&input Name_&i $2. Team_&i $2.;
                %else %let input=&input Score_&i $2. No_&i $2.;
        %end;
        &input
%mend;
data _null_;
   infile benzon end=last;
   input @3 F2 1. +(f2*4) f4 1.;
   if _n_=1 then call execute('data raw; infile benzon;');
   call execute('input #'||strip(_n_)||' F1 $2. F2 1.');
   call execute('%varlist(f2,'||f2||')');
   call execute('F4 1.');
   call execute('%varlist(f4,'||f4||')');
   call execute('Text $2.;output;call missing(of _all_);');
   if last then call execute('run;');
run;[/code:1ylqnnv4]
作者: shiyiming    时间: 2010-5-26 15:35
标题: Re: 又遇到难题了,请高手们支招啊...
谢谢hopewell,我现在知道自己程序为什么有问题了,虽然还没找到怎么解决.

另外我也大致看懂了你的程序,根据我给的那两行数据测试是达到了目的, 但我试了一下4行的数据,特别是后面行的重复次数比上面行少的时候,就出现问题了, 好像是继承了上一行多出来那些变量,象下面

数据
aa3ddeezzyybbcc2ddeeffgghh
aa3ddeezzyybbdd2ddeeffgghh
aa2bbccmmnn3ddeeffggiijjhh
aa2bbccmmnn2ddeeffgghh

结果
  
[code:1il588vq]F1 F2 Name_1 Team_1 Name_2 Team_2 Name_3 Team_3 F4 Score_1 No_1 Score_2 No_2 Text Score_3 No_3
aa 3  dd     ee     zz     yy     bb     cc     2  dd      ee   ff      gg   hh     
aa 3  dd     ee     zz     yy     bb     dd     2  dd      ee   ff      gg   hh     
aa 2  bb     cc     mm     nn     bb     dd     3  dd      ee   ff      gg   hh   ii      jj
aa 2  bb     cc     mm     nn     bb     dd     2  dd      ee   ff      gg   hh   ii      jj[/code:1il588vq]

本来第3/4行是没有Name_3和Team_3的嘛,第4行是没有Score_3和No_3的嘛, 看半天没搞懂为什么...再请教..
作者: shiyiming    时间: 2010-5-26 17:36
标题: Re: 又遇到难题了,请高手们支招啊(希望hopewell看到)
改过了
作者: shiyiming    时间: 2010-5-27 11:50
标题: Re: 又遇到难题了,请高手们支招啊(希望hopewell看到)
哈哈, 这里高手真多,差点没看懂,好奇多问一句, 如果数据不分行的呢(好象叫什么edsdic代码),应该怎么处理呢?
这是我正遇到的问题...




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