SAS中TRANWRD的问题

Roo*_*atu 3 sas

我有一个子串列表,我想从一列strings(names)中删除.我这样定义了这个列表:

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

ARRAY STR_TO_REM{*} STR1 - STR3;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这不起作用.例如,"Joe - cake"不会转换为"Joe".作为测试,我直接尝试了代码

test = tranwrd('Joe - cake',' - cake','');
Run Code Online (Sandbox Code Playgroud)

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

然而,STR_TO_REMOVE尽管打印出的变量看起来相同,但是对' - cake' 之间的平等测试失败了.我觉得我在这里缺少一些基本的东西,并且非常感谢任何帮助.

Joe*_*Joe 5

这是因为你的装饰在你放置的地方没有帮助.假设Str_To_Remove长度超过任何特定值,因为您的值长度不同,它必须在静止时进行空间填充.因此,您的修剪会删除随后用空格替换的空格,因为所有SAS字符串变量都会自动用空格填充其全长.varcharSAS中没有或类似的概念:10个字符的字符串包含10个字符,不多也不少.

在这种情况下,您必须trimtranwrd函数调用中使用它.这是一个常见的问题tranwrd,在这里的文档的第二个例子中明确地提到了它.我不知道他们为什么不添加一个参数来要求自动修剪,就像其他一些功能一样.

  • 作为感恩的表达,我将把例子改为"乔 - 蛋糕"而不是"约翰尼 - 蛋糕".如果您喜欢其他糕点/食品,请告知我们. (2认同)