【问题标题】:SAS 9.4 Character functions - Why might one cell return unexpected results?SAS 9.4 字符函数 - 为什么一个单元格会返回意外结果?
【发布时间】:2017-12-25 05:50:47
【问题描述】:

我正在处理一些字符串变量,并且某些单元格正在返回带有子字符串和长度函数的意外值。这些单元格包含字符格式的日期,因为我需要在将它们转换为 SAS 日期之前进行一些操作,因为它们来自 Excel 文件的性质。这是一个例子:

有:
观察_orig
1 4/3
2 12 月 16 日
3 1/13
4 6/2
5 3/10
6 5/4
7 月 10 日 14 日

想要:
观测值 _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;

这就是我得到的。差异以粗体显示。
观测值 _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 在长度应该 = 3 时计算长度 = 5。在这两种情况下,子字符串派生变量的值都是空白的。如果我在代码中使用 compress()、trim() 或 trimn() 而不是 strip(),结果是一样的。感谢您提供的任何帮助

【问题讨论】:

    标签: string date sas substring string-length


    【解决方案1】:

    听起来您的数据中可能包含无法打印的字符。如果你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');
    

    【讨论】:

    • 完美!不可打印字符是所有者/用户添加的单元格内换行符。为了使您提供的压缩功能起作用,我添加了一个额外的逗号:_strip=compress(orig,,'kw');再次感谢您。
    • 很高兴它成功了。很好地抓住了两个逗号。更新了答案。
    【解决方案2】:

    对我来说似乎很清楚,您的变量有前导空格或其他看起来像屏幕上的空格的前导字符。因此,对于 OBS=6,字符串的值更像是 " 5/4",它的长度为 5,前两个字符看起来都像空格。如果您的新 _sub_1_2 变量的 LENGTHN() 不是 0,那么它那里有一些非打印字符。可能像 'A0'X 之类的东西,某些网页将其用作不间断空格或制表符 ('09'x)。

    我怀疑您不想要前两个字符,而是在使用 / 作为分隔符时想要第一个单词。您可以使用 LEFT() 或 STRIP() 函数来删除前导空格。或 COMPRESS() 删除其他垃圾。所以你可以使用 COMPRESS() 和 kd 修饰符来只保留数字和斜杠。

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

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 1970-01-01
      • 2015-12-27
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多