我們經(jīng)常使用length語(yǔ)句來設(shè)定一個(gè)字符型變量的長(zhǎng)度涧黄。但這個(gè)做法是有缺陷的。
圖中merge的兩個(gè)數(shù)據(jù)集中存在一個(gè)名為usubjid的變量氏淑,該變量是rawdata中給的拒逮,內(nèi)容不是sdtm的usubjid,僅僅是同名而已咱娶。因此我需要從新給該變量賦值米间。但因?yàn)樵兞块L(zhǎng)度比較小,只有$6膘侮,所以我需要在merge前聲明長(zhǎng)度防止截?cái)嗲5腥さ氖沁@段代碼的結(jié)果為:
我們發(fā)現(xiàn),length的確是200了喻喳,但informat和format還是$6另玖,結(jié)果不出意外的被截?cái)嗔恕?/p>
這個(gè)涉及到length,informat和format的區(qū)別。format相當(dāng)于數(shù)據(jù)的外衣谦去,底層存儲(chǔ)的數(shù)據(jù)不變慷丽,不同format只是展示的方式不同。informat是讀入數(shù)據(jù)的方式鳄哭,不同informat要糊,導(dǎo)致讀入的底層數(shù)據(jù)不同。比如我們讀入的目標(biāo)是這樣一段內(nèi)容“20220208”妆丘,如果選擇使用$8這個(gè)information锄俄,讀入的就是一段8個(gè)字符長(zhǎng)度的字符串。如果使用best這個(gè)informat勺拣,讀入的是兩千多萬(wàn)的數(shù)值奶赠。如果用yymmdd8這個(gè)informat,那么讀入的是一個(gè)代表日期的數(shù)值药有。
一般來說當(dāng)代碼中變量是一個(gè)新增變量毅戈,length,informat愤惰,format往往是一致的苇经,你讀入一個(gè)另兩個(gè)自動(dòng)一致。所以當(dāng)我們用length時(shí)宦言,你雖然沒有設(shè)定informat和format扇单,但sas會(huì)自動(dòng)按照l(shuí)ength設(shè)定。
但我以上這個(gè)例子則不同奠旺,當(dāng)我設(shè)定了length蜘澜,sas在隨后讀入all這個(gè)數(shù)據(jù)集,并在隨后讀到了相同的變量usubjid凉倚,由于length已經(jīng)在之前設(shè)定了兼都,所以依然是200,但由于此時(shí)informat和format還是空的稽寒,所以這兩個(gè)會(huì)變成$6。
為了解決這個(gè)問題趟章,我將length改為了informat杏糙,結(jié)果如下:
從結(jié)果來看,length會(huì)被informat決定蚓土,也就是說盡管我沒有事前定義length宏侍,但因?yàn)閕nformat被定義為200,所以length并沒有受到all中參數(shù)的影響蜀漆。我想sas內(nèi)部應(yīng)該有個(gè)規(guī)則——length不能低于informat的長(zhǎng)度谅河。
總之,在今后的工作中,建議不再使用length規(guī)定變量長(zhǎng)度绷耍,直接使用informat會(huì)更好吐限,因?yàn)閕nformat可以同時(shí)保證length,而length無法保證informat褂始。