2017-07-19 14 views
0

我正在操纵一些字符串变量,并且某些单元格使用子字符串和长度函数返回了意外的值。这些单元格包含字符格式的日期,因为我们需要在将它们转换为SAS日期之前进行一些操作,因为它们来自的Excel文件的性质。下面是一个例子:SAS 9.4字符函数 - 为什么一个单元可能返回意外的结果?

HAVE:
OB的_orig
1 4/3
2 12/16
3 1/13
4 6/2
5 3/10
6 5/4
7 10/14

WANT:
OB的_orig _length _sub_1_2
1 4/3 3 4/
2 12/16 5 12
3 1/13 4 1/
4 6/2 3 6/
5 3/10 4 3/
6 5/4 3 5/
7 10/14 5 10

我使用这个代码:

data want; 
set have; 
_strip=strip(_orig); 
_sub_1_2=substr(_strip,1,2); 
_length=length(_strip); 
run; 

这是我得到的。差异是粗体。
OB的_orig _length _sub_1_2
1 4/3 5
2 12/16 5 12
3 1/13 4 1/
4 6/2 3 6/
5 3/10 4 3/
6 5/4 5
7 10/14 5 10

两个这样的情况:SAS计算长度= 5时长度应该= 3。在这两种情况下,对于子衍生的变量的值是空白共。如果我在我的代码中使用compress(),trim()或trimn()而不是strip(),结果是一样的。感谢您提供的任何帮助

回答

0

听起来就像您的数据中可能有不可打印的字符。如果你的日志是PUT _orig $hex.;,你看到了什么?应该是:342F332020

152 data want; 
153 length orig $5; 
154 orig='4/3'; 
155 len=length(orig); 
156 put orig= len=; 
157 put orig hex.; 
158 run; 

orig=4/3 len=3 
342F332020 

为了摆脱非打印字符,你可以尝试:

_strip=compress(orig,,'kw'); 
+0

完美!不可打印的字符是所有者/用户添加的单元格内换行符。为了使你提供的压缩功能正常工作,我添加了一个额外的逗号:_strip = compress(orig ,,'kw');再次感谢你。 – LRS

+0

很高兴工作。两个逗号都很好。更新了答案。 – Quentin

0

似乎非常清楚,我认为你的变量有看起来像空格前导空格或其他前导字符屏幕上。因此,对于OBS = 6,字符串的值更像" 5/4",长度为5,前两个字符看起来像空格。如果你的新_sub_1_2变量的LENGTHN()不是0,那么它在那里有一些非打印字符。也许像某些网页用作非破坏性空间或制表符('09'x)的'A0'X。

我怀疑你不想要前两个字符,而是想用第一个字时,使用/作为分隔符。您可以使用LEFT()或STRIP()函数删除前导空白。或COMPRESS()删除其他垃圾。因此,您可以使用COMPRESS()与kd修饰符仅保留数字和斜线。

data want; 
    set have; 
    length first $5 ; 
    first = scan(compress(_orig,'/','kd'),1,'/'); 
run; 
相关问题