SAS中TRANWRD的问题

时间:2015-03-11 14:52:12

标签: sas

我有一个子串列表,我想从一列字符串(names)中删除它。我这样定义了这个列表:

STR1 = ' - cake';
STR2 = ' - pie';
STR3 = ' - eclair';

ARRAY STR_TO_REM{*} STR1 - STR3;

我使用以下代码删除子字符串:

N=1;
DO WHILE (N <= DIM(STR_TO_REM));
    STR_TO_REMOVE = TRIM(STR_TO_REM(N));
    name = TRANWRD(name,STR_TO_REMOVE,'');
    N = N+1;
END;

出于某种原因,这不起作用。例如,&#34;乔 - 蛋糕&#34;不会转换为&#34; Joe&#34;。作为测试,我直接尝试了代码

test = tranwrd('Joe - cake',' - cake','');

并获得了预期的输出,表明至少基本的想法是合理的(我知道正则表达式是一种优越的方法,但我更感兴趣的是理解为什么代码在这一点上意外地表现)。

但是,STR_TO_REMOVE和&#39;之间的平等测试 - 蛋糕&#39;尽管打印出的变量看起来相同,但失败了。我觉得我在这里缺少一些基本的东西,并且非常感谢你对此有所帮助。

1 个答案:

答案 0 :(得分:5)

这是因为你的装饰在你放置它的位置没有帮助。假设Str_To_Remove比任何特定值都长,它必须是因为你的值长度不一样,所以在休息时它必须是空间填充的。因此,您的修剪会删除随后用空格替换的空格,因为所有SAS字符串变量都会自动用空格填充其全长。 SAS中没有varchar或类似概念:10个字符的字符串包含10个字符,不多也不少。

在这种情况下,您必须在trim函数调用中使用tranwrd。这是tranwrd的常见问题,在文档here的第二个示例中明确指出了这一点。我不知道他们为什么不添加一个参数来要求自动修剪,就像其他一些函数一样。