2015-02-06 209 views
1

這是我的一個早期問題的後續。 Transposing Comma-delimited fieldSAS Transpose逗號分隔字段

我爲特定情況工作的答案,但現在我有一個更大的數據集,因此在datalines語句中讀取它不是一個選項。我有類似於此過程中創建一個數據集:

data MAIN; 
    input ID STATUS STATE $; 
cards; 
123 7 AL,NC,SC,NY 
456 6 AL,NC 
789 7 ALL 
; 
run; 

有兩個問題在這裏: 1:我需要在狀態的每個狀態的單獨行列 2:注意第三個觀察說'所有'。我需要用一個特定狀態列表替換它,我可以從一個單獨的數據集(下面)中獲取這些狀態。

data STATES; 
    input STATE $; 
cards; 
AL 
NC 
SC 
NY 
TX 
; 
run; 

所以,這是我嘗試的過程似乎並沒有工作。 首先,我創建了插補所需的狀態列表,以及所述狀態的計數。

proc sql; 
    select distinct STATE into :all_states separated by ',' 
    from STATES; 
    select count(distinct STATE) into :count_states 
    from STATES; 
quit; 

其次,我試圖推定列表中'ALL'值出現在STATE的列表。這是第一個錯誤出現的地方。我怎樣才能確保變量STATE足夠長的新值?另外,我如何處理逗號?

data x_MAIN; 
    set MAIN; 
    if STATE='ALL' then STATE="&all_states."; 
run; 

最後,我用SCAN函數一次讀取一個狀態。我也在這裏得到一個錯誤,但我認爲修復上述部分可能會解決它。

data x_MAIN_mod; 
    set x_MAIN; 
    array state(&count_states.) state:; 
    do i=1 to dim(state); 
     state(i) = scan(STATE,i,','); 
    end; 
run; 

在此先感謝您的幫助!

回答

3

看起來你幾乎就在那裏。在最後一個數據步驟嘗試此操作。

data x_MAIN_mod; 
    set x_MAIN; 
    format out_state $2.; 
    nstate = countw(state,","); 
    do i=1 to nstate; 
     out_state = scan(state,i,","); 
     output; 
    end; 
run; 
+0

謝謝DomPazz。這並不能完全解決長度問題,因爲ID 789缺少SC,TX。有沒有辦法強制數據語句將整個宏讀入x_main? – pyll 2015-02-06 12:54:05

+1

重新定義狀態的長度。 'data x_main;格式STATE $ <大數字here>; set main; ... run;'通常當你看到截斷時,這是因爲變量的長度不夠高。 – DomPazz 2015-02-06 14:45:39

+0

如果它們處於STATE狀態,而不是OUT_STATE狀態,請嘗試'out_state = trim(scan(...));'刪除空白區域。 – DomPazz 2015-02-06 14:47:32

2

你是否真的需要這樣的兩個步驟?如果您沒有中間數據集,您可以在臨時變量中使用「大數」,並且對事物沒有太大影響。

data x_MAIN; 
    length state_temp $150; 
    set MAIN; 
    if STATE='ALL' then STATE_temp="&all_states."; 
    else STATE_temp=STATE; 
    array state(&count_states.) state:; 
    do i=1 to dim(state); 
     state(i) = scan(STATE,i,','); 
    end; 
    drop STATE_temp; 
run; 

如果你真的需要的狀態,那麼老實說,我會與大號碼走(= 50 * 3,所以不是所有的大),然後添加OPTIONS COMPRESS=CHAR;將(給予或採取)把你的CHAR字段變成VARCHAR(以CPU時間的一小部分爲代價,但通常遠小於節省的磁盤讀/寫時間)。

+0

感謝您的建議。我完全可以將這兩個步驟結合起來......我在調試過程中將它們分開了。 – pyll 2015-02-06 15:20:11