我试图通过使用tranwrd函数逐步删除同一行上的每个/ * * /注释对。但是,替换并不是出于某种原因。
以下是代码:
data _null_;
str="/* Comment 1 */ /* Comment 2 */ /* Comment 3 */ /* Comment 4 */";
do while(1);
startc=find(str,"/*");
endc=find(str,"*/");
put startc endc;
if startc = 0 then leave;
else do;
temp=substr(str,startc,endc-startc+2);
put "temp: " temp;
str=tranwrd(str,temp,"");
put "str: " str;
end;
end;
run;
代码进入无限循环,因为虽然temp得到" / * Comment 1 * /"的值,但TRANWRD由于某种原因无法替换。
答案 0 :(得分:1)
您需要TRIM查找(temp
)的参数。否则它最后会有无关的空间。请记住,SAS中的字符串变量总是有它们的全长 - 所以如果它是一个带有"ABCDE"
的200长字符串,它实际上是"ABCDE "
(最多200)。
data _null_;
str="/* Comment 1 */ /* Comment 2 */ /* Comment 3 */ /* Comment 4 */";
do while(1);
startc=find(str,"/*");
endc=find(str,"*/");
put startc endc;
if startc = 0 then leave;
else do;
temp=substr(str,startc,endc-startc+2);
put "temp: |" temp "|";
str=tranwrd(str,trim(temp),"");
put "str: " str;
end;
end;
run;
见| |临近;它周围至少有一个额外的空间。你的例子是偶然的,因为你错误地将长度加2(应该加一个);由于你所有temp
个论点的长度相同,如果你加了1就不会出现,但在现实世界的例子中,这可能并非如此。
此外,如果您希望将其替换为空,而不是单个空格,则需要使用TRANSTRN
和TRIMN
(我认为是9.2+)。上面的代码实际上用一个空格替换它。 SAS没有""
的概念,字符null / missing始终是" "
。 TRIMN
和TRANSTRN
允许您将此替换作为一种解决方法。