2017-07-19 13 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; 
相關問題