TRANWRD无法正确替换

时间:2014-03-23 12:58:31

标签: string sas

我试图通过使用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由于某种原因无法替换。

1 个答案:

答案 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就不会出现,但在现实世界的例子中,这可能并非如此。

此外,如果您希望将其替换为空,而不是单个空格,则需要使用TRANSTRNTRIMN(我认为是9.2+)。上面的代码实际上用一个空格替换它。 SAS没有""的概念,字符null / missing始终是" "TRIMNTRANSTRN允许您将此替换作为一种解决方法。