簡體   English   中英

SAS 9.4字符功能-為什么一個單元格會返回意外結果?

[英]SAS 9.4 Character functions - Why might one cell return unexpected results?

我正在處理一些字符串變量,某些單元格使用子字符串和長度函數返回了意外的值。 這些單元格保存字符格式的日期,由於它們來自Excel文件,因此我需要做一些操作,然后再將它們轉換為SAS日期。 這是一個例子:

有:
Obs _orig
1 4/3
2 12/16
3 1/13
4 6/2
5 3/10
6 5/4
7 10/14

想:
Obs _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;

這就是我得到的。 差異以粗體顯示。
Obs _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

兩種情況下,當長度應為3時,SAS都會計算長度=5。在兩種情況下,子字符串派生變量的值都為空。 如果我在代碼中使用compress(),trim()或trimn(),而不是strip(),則結果相同。 感謝您提供任何幫助

聽起來好像不可打印的字符進入了您的數據。 如果您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');

對我來說似乎很清楚,您的變量具有前導空格或其他看起來像屏幕上空格的前導字符。 因此,對於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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM