2012-10-03 69 views
3

這看起來非常簡單,但預計它不工作:累加文本變量跨越觀察

data names; 
    input name $12.; 
    cards; 
John 
Jacob 
Jingleheimer 
Schmidt 
; 
run; 

data names; 
    length namelist $100.; 
    set names end=eof; 
    retain namelist; 
    if _n_=1 then namelist=name; 
    else namelist = namelist || "|" || name; 
    if eof then output; 
run; 

我希望得到的結果有含

約翰一個觀察|雅各布| Jingleheimer |施密特

但是namelist只是John。我究竟做錯了什麼?

回答

5

您需要在連接到列表之前修剪空白。

data names; 
    length namelist $100.; 
    set names end=eof; 
    retain namelist; 
    if _n_=1 then namelist=trim(name); 
    else namelist = trim(namelist) || "|" || trim(name); 
    if eof then output; 
run; 

您也可以使用貓()函數(爲你做了微調和串聯):

data names; 
    length namelist $100.; 
    set names end=eof; 
    retain namelist; 
    if _n_=1 then namelist=name; 
    else namelist = cats(namelist,"|",name); 
    if eof then output; 
run; 
+0

啊哈,謝謝!你能解釋爲什麼嗎?是否填充了導致填充可用空間的文本? – itzy

+2

當然 - 根據此鏈接(http://support.sas.com/documentation/cdl/en/basess/58133/HTML/default/viewer.htm#a001336080.htm)「當字符值小於長度它所屬的變量,SAS用尾隨空格填充該值。「如果您看到關於連接和刪除內部空白的標題,它們會更詳細一些。 –

0

如果添加脫至分配

strip(namelist) || "|" || name 

它會工作也

(但CATS是一個非常好的解決方案)

0

使用catx的功能允許您指定分隔符......

data names; 
    length namelist $100.; 
    set names end=eof; 
    retain namelist; 
    namelist = catx("|",namelist,name); 
    if eof then output; 
run;