SAS中的TRANWRD问题

SAS中的TRANWRD问题,sas,Sas,我有一个要从字符串列(名称)中删除的子字符串列表。我这样定义列表: 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_T

我有一个要从字符串列(
名称
)中删除的子字符串列表。我这样定义列表:

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;
并获得了预期的输出,这表明至少基本思想是正确的(我知道正则表达式是一种更好的方法,但我更感兴趣的是理解代码在这一点上的意外行为)


然而,
STR_TO_REMOVE
和'-cake'之间的相等性测试失败,尽管变量的打印输出看起来相同。我觉得我在这里遗漏了一些基本的东西,非常感谢您的帮助。

这是因为您的修剪对您放置的位置没有帮助。假设
Str\u To\u Remove
比任何特定的值都长,因为您的值在长度上不相同,所以必须在静止时填充空格。因此,修剪将删除空格,然后将其替换为空格,因为所有SAS字符串变量都会自动用空格填充到其完整长度。SAS中没有
varchar
或类似的概念:10个字符的字符串包含10个字符,不多也不少


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

我不会说正则表达式是一种更好的方法;如果你正在做一个简单的翻译,只想替换一组单词,如果你的列表不是太长的话,这可能会更快。我可能会做一些不同的事情(特别是取决于替换列表的定义),但是
tranwrd
方法是合理的。为了表示感谢,我将把示例改为“Joe-cake”而不是“Johnny-cake”。如果您喜欢其他糕点/食品,请告诉我。
test = tranwrd('Joe - cake',' - cake','');