SAS:Where语句不使用字符串值

时间:2013-10-05 13:52:13

标签: sas where

我正在尝试在名为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”,但每当我打印数据时,这就是我看到的值。

1 个答案:

答案 0 :(得分:2)

这是处理字符串数据时的常见问题(并且有充分的理由不要!)。您应该考虑数据的来源 - 它是否来自网络表单?然后它可能包含不间断的空格('A0'x)而不是常规空格('20'x)。它来自unicode环境(比如,日文字符是否合法)?那么你可能有转码问题。

一些适用于绝大多数这些问题的选项:

  1. 压缩除字母字符以外的所有内容。例如where=(compress(varname,,'ka') ne 'ANeverUsed')。 'ka'的意思是'只保留'和'字母字符'。
  2. UPCASE或LOWCASE,以确保您没有遇到案件问题。
  3. 在数据步骤中使用put varname HEX.;查看基础字符。每两个十六进制字符是一个字母字符。 20是空格(strip将删除)。在执行此操作之前按varname排序,以便您可以轻松地看到您认为应该将这个值彼此相邻的行 - 有什么区别?可能是一些特殊字符,或多字节字符,或谁知道什么,但这里应该很明显。