Я ткнул носом в расширение обработки строк SAS с помощью некоторых функций C, таких как самый длинный алгоритм общих подстрок. Функции Proc FCMP становятся довольно неэффективными.
Встроенный компилятор C в proc proto, похоже, не дает ожидаемых результатов после написания алгоритма в Visual Studio. Думаю, я убедился в том, что строки, передаваемые в функцию C, кажутся заполненными пробелом длиной примерно 100 символов.
Прежде чем я продолжу писать код для определения места, где должна заканчиваться строка, я хотел бы знать, знает ли кто-нибудь об альтернативных подходах или вообще может поделиться идеями о написании функций C для SAS?
Вот пример кода
/* C functions*/
proc proto package=sasuser.funcs.sfuncs;
/* A string length function */
int cslen(const char *s);
externc cslen;
int cslen(const char *s)
{
int i=0;
while (s[i++]!=0){}
return i-1;
}
externcend;
/* A char function */
int cschar(const char *s,const int pos);
externc cschar;
int cschar(const char *s,const int pos)
{
return s[pos];
}
externcend;
run;
option cmplib=sasuser.funcs;
/* SAS wrappers */
proc fcmp outlib=sasuser.funcs.sfuncs;
function slen(s $);
val=cslen(s);
return(val);
endsub;
function schar(s $,pos);
val=cschar(s,pos);
return(val);
endsub;
quit;
Проверка функций с помощью
/* Tests */
data _null_;
length str $6.;
str="foobar";
len=slen(str);
firstchar=schar(str,0);
lastchar=schar(str,5);
shouldbenull=schar(str,6);
put _all_;
run;
дает
str=foobar len=91 firstchar=102 lastchar=114 shouldbenull=32 _ERROR_=0 _N_=1
РЕДАКТИРОВАТЬ: Мы, оказывается, вы можете взломать себя вокруг этого, просто обрезая строку в обертках, например:
proc fcmp outlib=sasuser.funcs.sfuncs;
function slen(s $);
val=cslen(trim(s));
return(val);
endsub;
quit;