2015-02-06 207 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