我正在尝试在名为dataname的数据子集上使用PROC FREQ。我希望它包含varname不等于“A.Never Used”的所有行。我有以下代码:
proc freq data = dataname(where =(varname NE'A.Never Used')); 运行;
我认为尾随或引导空白可能存在问题所以我也试过了:
proc freq data = dataname(where =(strip(varname)NE'A.Never Used')); 运行;
我的猜测是出于某些原因,我的字符串值不是“A.Never Used”,但每当我打印数据时,这就是我看到的值。
答案 0 :(得分:2)
这是处理字符串数据时的常见问题(并且有充分的理由不要!)。您应该考虑数据的来源 - 它是否来自网络表单?然后它可能包含不间断的空格('A0'x)而不是常规空格('20'x)。它来自unicode环境(比如,日文字符是否合法)?那么你可能有转码问题。
一些适用于绝大多数这些问题的选项:
where=(compress(varname,,'ka') ne 'ANeverUsed')
。 'ka'的意思是'只保留'和'字母字符'。put varname HEX.;
查看基础字符。每两个十六进制字符是一个字母字符。 20
是空格(strip
将删除)。在执行此操作之前按varname
排序,以便您可以轻松地看到您认为应该将这个值彼此相邻的行 - 有什么区别?可能是一些特殊字符,或多字节字符,或谁知道什么,但这里应该很明显。