2015-09-24 38 views
0

我創建了一個格式,比如下面使用設置

data formatset; 
    input fmtname $ start $ end $ label $; 
    datalines; 
$test region1 region3 zone1 
$test region4 region5 zone2 
$test region6 region7 zone3 
; 
run; 

proc format library = work.formats 
    cntlin = work.formatset; 
run; 
quit; 

問題:我將有新的datalines數據與變量region。我想有一個新的屬性zone其使用的格式$test.

data output; 
    input region $; 
    format zone $test.; 
    zone = region; 
    datalines; 
region1 
region2 
region3 
region4 
region5 
region6 
region7 
region8 
; 
run; 

enter image description here

回答

2

您可以使用您的格式,以確保有足夠的字符都從你的zone可變的讀取時需要指定的寬度。在第二個數據步驟中嘗試format zone $test7.;

如果不指定寬度,SAS將默認爲爲格式定義的任何顯示值的最大長度。在查找要顯示的格式化值時,它將從格式化變量中只讀取很多字符(在你的情況5中),如果這5個字符的格式中沒有指定值,則它們逐字顯示。

1

當您使用格式

隨着format zone $test.;有什麼不順心,你內部長度$5(五個字符)創建的變量zone。爲了證明,運行

proc contents data=output; 
run; 

隨着zone = region;您在region的值賦給zone,然後將其截斷爲5個字符。該標籤僅適用於打印或列出數據。在那個時間點,變量zone包含文本「區域」,其不在startend範圍之一中,因此不被翻譯。

你怎麼可以使用格式來治癒它是當你把值賦給zone,寫zone = put(region, $test);已經應用的格式

的一種方式,當治癒這種。

另一個是在給出格式之前明確指定區域的存儲長度length zone $7;,或者像format zone $test.;一樣同時執行兩個區域,就像其他答案所暗示的那樣。

爲什麼這種形式表現這樣

當您使用cntlin,在proc format創建一個字符格式,它接收的長度最大標籤長度,你的情況5個字符。該長度是存儲該​​格式的變量的字符數。 你可以看到,如果你運行

proc format library = work.formats 
    cntlin = work.formatset; 
run; 

這是不符合邏輯的,的確,什麼是壞:你不能在你的cntlin數據集中指定的長度改變這種狀況。

如何治癒它在格式本身

只需指定其格式應顯示長的8個字節的東西的任何值:

data formatset; 
    input fmtname $ start $ end $ label $; 
    datalines; 
$test region1 region3 zone1 
$test region4 region5 zone2 
$test region6 region7 zone3 
$test _dummy_ _dummy_ 1234567 
; 
run; 
1

的問題是,你沒有定義變量在給它分配一個格式之前的區域。所以SAS使用分配格式的默認長度來定義變量區域。您可以通過將FORMAT語句移至賦值語句之後來解決此問題。然後SAS會假定ZONE的長度應該與REGION的長度相同。

但真正的解決方案是在使用它們或將格式附加到它們之前定義您的變量。

data output; 
    length region $8 zone $8 ; 
    input region; 
    zone = region; 
    format zone $test.; 
cards ; 
... 

如果您希望ZONE的值是$ TEST的值。格式將顯示,然後在賦值語句中使用PUT()函數,而不是將格式附加到變量。

zone = put(region,$test.);