[英]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()與k
和d
修飾符一起使用,以僅保留數字和斜杠。
data want;
set have;
length first $5 ;
first = scan(compress(_orig,'/','kd'),1,'/');
run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.