SAS中文论坛

标题: 请教问题,data步数学表达式字符解析? [打印本页]

作者: shiyiming    时间: 2011-3-3 20:21
标题: 请教问题,data步数学表达式字符解析?
data _null_;
d="5+2";
a=[i:2jl8w8c9]evalfunction[/i:2jl8w8c9](d);/*a=7*/
run;

[i:2jl8w8c9]evalfunction[/i:2jl8w8c9]有这样的函数么?

另外以前有个在data步用的%do循环,我忘了怎么用了。。。
记得是
data a;
set (%do i=1 %to 500;.....);
什么的,然后就直接可以set500个数据集了,
我是想直接连接数组元素
谢谢
作者: shiyiming    时间: 2011-3-3 21:13
标题: Re: 请教问题,data步数学表达式字符解析?
问题1:

好像没有,貌似这个问题2008年在sasor上谈论得火热,见:http://www.feoh.net/sasor/viewtopic.php?f=1&t=3819。


问题2好像问题1里面有解,如果我读懂你的意思的话。
作者: shiyiming    时间: 2011-3-3 22:50
标题: Re: 请教问题,data步数学表达式字符解析?
强悍的记忆力~我都忘了~

本来是用的先搞到宏再搞回去的方法,比直接data步慢几十倍。
老贴的看了,比较慢都。


那个do的以前这里看过,sugi也有,可是忘了,就是为了
a[1]="5";
a[2]="+";
a[3]="2";
dd=compress(a[1]||a[2]||a[3]," ");

a[1]||a[2]||a[3]这里省事儿。
作者: shiyiming    时间: 2011-3-4 01:24
标题: Re: 请教问题,data步数学表达式字符解析?
笔记
CAT
实际时间          2.70 秒
      CPU 时间          2.73 秒

CATS
       实际时间          2.84 秒
      CPU 时间          2.82 秒

TRIM
         实际时间          2.82 秒
      CPU 时间          2.82 秒

TRIMN
          实际时间          2.95 秒
      CPU 时间          2.95 秒

STRIP
          实际时间          2.96 秒
      CPU 时间          2.98 秒

COMPRESS+' '
          实际时间          3.17 秒
      CPU 时间          3.17 秒

||
          实际时间          2.81 秒
      CPU 时间          2.81 秒

%SYSEVALF=%EVAL
      实际时间          2.67 秒
      CPU 时间          2.67 秒
作者: shiyiming    时间: 2011-3-4 02:22
标题: Re: 请教问题,data步数学表达式字符解析?
to superkuhasu
depends on how complex your opertors are, the solution could be complex or simple
is there any formula looks like "5*exp(1.7-2) / log(45)"?

I can only think of parsing the string at this moment
作者: shiyiming    时间: 2011-3-4 11:52
标题: Re: 请教问题,data步数学表达式字符解析?
to oloolo
toby dunn on SAS-L mentioned using RESOLVE function, which can handle standard math operators
作者: shiyiming    时间: 2011-3-4 16:24
标题: Re: 请教问题,data步数学表达式字符解析?
%eval和%SysEvalF快,但是复杂的表达情况好像不行吧~
resolve是可以处理,但是%eval需要3秒多的它用一分十几秒。
作者: shiyiming    时间: 2011-3-5 17:30
标题: Re: 请教问题,data步数学表达式字符解析?
%eval和%SysEvalF在解析的时候有问题。
如果有这样的函数就好了
data _null_;
a="52";
b="+23*log(4)";
c=TheFunction(a,b);
put c=;
run;
/*log:
c=83.884770306
*/
作者: shiyiming    时间: 2011-3-5 17:46
标题: Re: 请教问题,data步数学表达式字符解析?
折腾了半天,还是得用原来的方法~~~
作者: shiyiming    时间: 2011-3-5 18:36
标题: Re: 请教问题,data步数学表达式字符解析?
[quote="qkaiwei":3po4zwy3]这个方法要改我公式,我不是特别喜欢. 仅做参考.
data tmp;
input formula:$20. a b c d;
call symput('formula',formula);
call symput('a',a);
call symput('b',b);
call symput('c',c);
call symput('d',d);
call execute('%let result=%sysevalf(&formula)');
result =symget('result');
put result;
cards;
&a*&b 1 2 3 4
&b*&c 1 2 3 4
;
run;[/quote:3po4zwy3]


表达式处理的话,会是一个灰常灰常麻烦的事情~~
作者: shiyiming    时间: 2011-3-5 19:18
标题: Re: 请教问题,data步数学表达式字符解析?
super K总, 为什么不自己编个函数呢,9.2不是可以自定义函数么 ?

不过就算是用C编出来的,速度仍然可能有问题,不过可以试试嘛。
作者: shiyiming    时间: 2011-3-5 21:08
标题: Re: 请教问题,data步数学表达式字符解析?
dll引用应该是AF和fcmp的proto吧,不过fcmp不支持float,估计只能AF,或者返回值一律string。
混合编程的话,还不一定怎么样呢~~

如果哪位大侠精通c/c++,如果搞个函数,参数为字符串string表达式,然后用c本身的math包或者网上的math包计算后,返回函数值。才行。
而且还得是resolveformular(string formular)   return  string result或者float result才行。
我先去找找看有没有现成的这种dll包。谢谢提醒~

另外发邮件问sas去了,可惜现在周末,看看总部那边怎么说。反正我是觉得缺这么个函数,本来挺简单一事儿。 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
作者: shiyiming    时间: 2011-3-5 21:18
标题: Re: 请教问题,data步数学表达式字符解析?
咦~?对了,sas/base在data step不也是赋值之后解析么?
如果能直接找到sas的dll拿不就省事儿了?


。。。。。core下面两千多dll。。。。 <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
作者: shiyiming    时间: 2011-3-5 21:35
标题: Re: 请教问题,data步数学表达式字符解析?
一大堆mcn_main,这条路不通。。




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