我有一个子串列表,我想从一列字符串(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;尽管打印出的变量看起来相同,但失败了。我觉得我在这里缺少一些基本的东西,并且非常感谢你对此有所帮助。
答案 0 :(得分:5)
这是因为你的装饰在你放置它的位置没有帮助。假设Str_To_Remove
比任何特定值都长,它必须是因为你的值长度不一样,所以在休息时它必须是空间填充的。因此,您的修剪会删除随后用空格替换的空格,因为所有SAS字符串变量都会自动用空格填充其全长。 SAS中没有varchar
或类似概念:10个字符的字符串包含10个字符,不多也不少。
在这种情况下,您必须在trim
函数调用中使用tranwrd
。这是tranwrd
的常见问题,在文档here的第二个示例中明确指出了这一点。我不知道他们为什么不添加一个参数来要求自动修剪,就像其他一些函数一样。