2013-11-14 114 views
0

我試圖將數據集導出到使用的txt文件中;作爲分隔符,數據集有很多空值和char值,我想將所有值都替換爲''(這裏沒有空格)。SAS將null更改爲''

我嘗試使用下面的代碼要做到這一點,但它似乎SAS將改變「」到「」(一個空格)

if missing(VAR22) then VAR22='' ; 
put VAR22 $ @; 

全碼:

data _null_; 
set lib.TABLE;         
file "/home/user/file.txt" delimiter=';'; 
format VAR1 $1. ; 
format VAR2 $8. ; 
format VAR3 $3. ; 
format VAR4 $6. ; 
format VAR5 $9. ; 
format VAR6 $2. ; 
format VAR7 $1. ; 
format VAR8 $4. ; 
format VAR9 $1. ; 
format VAR10 $1. ; 
format VAR11 BEST12.; 
format VAR12 NUMX13.2; 
format VAR13 BEST12.; 
format VAR14 NUMX13.2; 
format VAR15 $1. ; 
format VAR16 $2. ; 
format VAR17 $3. ; 
format VAR18 $3. ; 
format VAR19 $4. ; 
format VAR20 $20. ; 
format VAR21 $1. ; 
format VAR22 $1. ; 

if missing(VAR1) then VAR1='' ; 
put VAR1 $ @; 
put VAR2 $ @; 
put VAR3 $ @; 
put VAR4 $ @; 
put VAR5 $ @; 
put VAR6 $ @; 
put VAR7 $ @; 
put VAR8 $ @; 
put VAR9 $ @; 
if missing(VAR10) then VAR10='' ; 
put VAR10 @; 
put VAR11 @; 
put VAR12 @; 
put VAR13 @; 
put VAR14 @; 
put VAR15 $ @; 
put VAR16 $ @; 
put VAR17 $ @; 
put VAR18 $ @; 
put VAR20 $ @; 
put VAR19 $ @; 
put VAR21 $ @; 
if missing(VAR22) then VAR22='' ; 
put VAR22 $ @; 
put ; 
run; 

我也試過使用選項missing ='',但它不起作用。

謝謝!

+0

我的意思是沒有,沒有引號和空格,基本上是一個空字符 – RamB

+0

這個代碼的問題是,當你說'如果缺少(VAR1),那麼VAR1 ='';'。假設VAR1缺失,則VAR1將被空字符覆蓋。 SAS將空字符(用於字符類型變量)作爲單個空白存儲,因此您又回到了開始的位置。 – dataNinja124

+0

是的,你是對的!我試圖用: put''@; 但它發送一個單引號到文本文件,有沒有辦法做到這一點? – RamB

回答

1

SAS不支持空字符串;根據定義,字符變量中沒有其他字符的任何數量的空格缺失。所有字符串以'20'x(普通空格字符)填充到其全長(無論分配給整個列),並且不能爲零長度。

根據你對這些變量所做的事情,有辦法讓它們不會影響你的下游過程。例如,如果變量是全部空格,則trimn將返回零長度字符串;所以如果var2只有空格,var0=trimn(var1)||trimn(var2)||trimn(var3)將返回var1||var3

如果您正在拼接,更好的方法是使用cats而不是||運算符,因爲它會自動刪除空格(包括從缺少的字符串中刪除所有空格)。結果變量必須包含空格,但組件已被刪除。

將字符串連接在一起的想法也很好。不幸的是,我不認爲CATX與完全缺失的字符串一起工作,但是你可以在宏或其他東西中這樣做。最後,如果你打算與另一個具有空字符串概念的DBMS接口,那麼可能會有更好的解決方案;發佈這些細節。

1

嘗試是這樣的:

data one; 
    length VAR1-VAR4 $1; 
    input VAR1-VAR4; 
    datalines; 
A B C D 
E . F G 
H . . J 
; 
run; 

data two; 
    set one; 
    SP=';'; 
    test1=trim(left(VAR1)) || sp || trim(left(VAR2)) || sp || trim(left(VAR3)) || sp || 
     trim(left(VAR4)); 
    test1 = compress(test1,' '); 
run; 

proc print data=two; 
run; 

我建議你建立一個簡單的宏通過所有VAR1運行 - VARXX。

如果你看看變量test1,你可以看到你想輸出到你的文本文件。

注意,如果任何char變量已經包含空格作爲其實際值的一部分,則此代碼將刪除它們。如果這是一個問題,讓我知道,我可以修復它。

+0

TRIMN將爲你想要的工作 - 它返回一個空字符串,而不是使用額外的COMPRESS行。 – Joe

+0

非常感謝,這不是我所需要的,但它適用於我在這裏做的其他事情! – RamB

+0

歡迎您:) ... upvotes非常感謝提示提示;) – dataNinja124