2013-01-10 26 views
4
data test; 
name = 'abcdefgh'; 
age = 30; 
res = name || age; 
run; 

當運行上述代碼的可變資源持有數字 - > ABCDEFGH 30連接具有字符

爲什麼數字可變年齡是填充用空白,然後用字符變量級聯?

回答

8

當數字和字符連接在一起時,數字首先轉換爲字符變量,然後將兩個字符變量連接在一起。將數字變量轉換爲字符變量的默認格式是BEST12。 (儘管這可以根據您的數字變量的格式而有所不同)。 put(30,BEST12.)會產生'          30',然後連接到字符變量。

要避免這種情況,可以使用strip作爲Aaron筆記,或者使用自動剝離所有變量的CATS(res=cats(name,age);)進行連接,或者自己放置數值變量(並且使用PUT,可以強制將其左對齊想用-l選項)。

+0

真棒解釋,謝謝喬,但無法理解你的意思'或自己把數字變量(和PUT,你可以強迫左對齊它,如果你想用-l選項)。 – athresh

+2

根據你的目標,還有很多'cats'函數的其他變體,所以不要忘記檢查'catt()'和'catx()'。 –

+3

我的意思是自己使用put函數 - 當你說'res = name || age;'時,SAS會自動爲你做這個,但是你可以很容易地做'res = name || put(age,3. -l);' 。有關更多信息,請參閱http://www.sascommunity.org/wiki/Tips:Aligning_with_a_Put_Function。 – Joe

2

嘗試下面的代碼來連接沒有空間的變量。

data test; 
name = 'abcdefgh'; 
age = 30; 
res = name || strip(age); 
run; 

SAS可能會古怪。對於「爲什麼」,我最好的猜測是SAS試圖讓這些數字看起來是正確的文本輸出列表。

+0

謝謝Aaron,但想知道爲什麼它填補空白,然後連接。 – athresh

0

您可以使用此還有:

res=name || put(age,3.); 

不要使用地帶,修剪等功能數值變量。您將在日誌窗口中看到NOTE:

注意:數字值已在(行):(列)給定的位置轉換爲字符值。

0

你曾問過「爲什麼」它在做。如果你強制SAS沒有將它定義爲使用其他人在此提到的方法,那麼當一個變量被定義爲字符串而另一個變量是數字時,可以運行排序問題。 例子:

VAR3 = VAR1 || VAR2; 
VAR4 = VAR1 || PUT(VAR2,2.); 

VAR1  VAR2 VAR3  VAR4 
DOG  1  DOG 1 DOG1 
DOG  2  DOG 2 DOG2 
...  ...  ...  ... 
DOG  11  DOG11 DOG11 

如果排序上VAR3你得到你可能想要的東西.... 如果排序上VAR4DOG1DOG11DOG2 ...

只是我的觀察。希望有所幫助。