最近生成一個ADaM的PARAM/PARAMCD遇到了一點問題。
對于Param系列變量的生成,一般我們在會提前在ADaM_VLM Spec中提前設(shè)置好每一個SDTM中--TESTCD對應(yīng)的Param等變量,直接Spec導(dǎo)入SAS數(shù)據(jù)集,與整理好的數(shù)據(jù)以--TESTCD為關(guān)鍵變量,拼接獲取Param變量。
Spec都是提前根據(jù)DM提供的數(shù)據(jù)說明寫好的,我們發(fā)現(xiàn),這一次數(shù)據(jù)有幾個檢測縮寫與說明上不同,主要是CD值得后綴數(shù)字不同。由于我們一個Product的項目共用一個SPEC,所以,不方便直接修改為一個項目直接修改SPEC。我們需要手動根據(jù)--TETCD的最后一個數(shù)字進行判斷。于是,接下來的問題就是如何獲取字符變量最后一個字符值。
SUBSTR
提取字符變量中的部分字符,需要用到SUBSTR函數(shù),這個函數(shù)有3個參數(shù):SUBSTR(string, position, <,length>)
- string: 指定具體的字符內(nèi)容,可以是字符串、字符變量或字符表達(dá)式,值不能為空。
- position: 指定截取開始的位置,取值為正整數(shù),且值不能超過字符的最大長度,值不能為空。
- length: 指定截取的長度;這個變量為空時,會提取從position開始到末尾的字符;變量值為0、負(fù)值或大于字符剩余長度時,SAS Log會報錯。
如何提取最后一個字符?
方法1
假設(shè)字符串為ABCD,提取最后一位字符只需要從第4位開始,提取一位就可以實現(xiàn)。SAS代碼如下:
data tmp1;
a = "ABCD";
b = substr(a, 4, 1);
run;
但是實際應(yīng)用時有個問題,我們無法提前確定好字符串的長度,這也就無法確定提取開始的位置。這時候需要使用LENGTH函數(shù)來提供字符變量的長度,這個長度也就是最后一個字符的位置,這樣就可以提取未知長度的字符值的最后一個字符。
data tmp2;
a = "ABCD";
b = substr(a, length(a), 1);
run;
這個方法,還可以延伸,例如,提取字符值的最后2個字符,起始位置就可以設(shè)置為length(a)-1;提取最后3個字符,起始位置就是length(a)-2……以此類推,提取最后n個字符,起始位置就是length(a)-(n-1)。
方法2
字符值的最后一個字符,等價于字符值翻轉(zhuǎn)之后第一個字符。將字符值翻轉(zhuǎn)后,之前最后一個字符就排在第一位,就不需要救助字符值長度來確定字符位置。實現(xiàn)字符串翻轉(zhuǎn)的函數(shù)的是reverse。
data tmp3;
a = "ABCD";
b =substr(reverse(a), 1, 1);
run;
以上就是SAS中獲取字符串中最后一個字符的2種方法。
感謝閱讀!若有疑問,歡迎評論區(qū)交流!