0

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

4

1 回答 1

2

这是处理字符串数据时的常见问题(也是不这样做的一个很好的理由!)。您应该考虑数据的来源——它来自网络表单吗?然后它可能包含不间断空格('A0'x)而不是常规空格('20'x)。它是否来自 unicode 环境(例如,日文字符是合法的)?那么你可能会遇到转码问题。

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

  1. 压缩除字母字符以外的所有内容。where=(compress(varname,,'ka') ne 'ANeverUsed')例如。“ka”表示“只保留”和“字母字符”。
  2. UPCASE 或 LOWCASE 以确保您不会遇到大小写问题。
  3. 在数据步骤中使用put varname HEX.;以查看基础字符。每两个十六进制字符是一个字母字符。 20是空间(strip将删除)。在执行此操作之前进行排序,varname以便您可以轻松地看到您认为应该具有此值的行彼此相邻 - 有什么区别?可能是一些特殊字符,或多字节字符,或者谁知道呢,但在这里应该很明显。
于 2013-10-05T19:58:53.283 回答