1. 程式人生 > 其它 >SAS函式學習筆記

SAS函式學習筆記

技術標籤:SAS技能——工作積累

一、字元變數的儲存長度

SAS怎樣定義字元變數的儲存長度?

DATA EXAMPLE1;
	INPUT GROUP $ @10 STRING $3.;
	LEFT  = 'X    ';            /* X和4個空格 */
	RIGHT = '    X';            /* 4個空格和X */
	SUB   = SUBSTR(GROUP,1,2);
	REP   = REPEAT(GROUP,1);
DATALINES;
ABCDEFGH 123
XXX 4
Y 5
;

/*VARNUM選項——要求變數按照它們在SAS資料集中出現的順序排列,而不是預設的字母順序。*/
PROC CONTENTS DATA=EXAMPLE1 VARNUM;
	TITLE "PROC CONTENTS for Data Set EXAMPLE1";
RUN;

/*用length語句給變數定義長度*/
LENGTH GENDER $ 6;
IF SEX = 1 THEN GENDER = 'MALE';
ELSE IF SEX = 2 THEN GENDER = 'FEMALE';

輸出結果:

注意:

  1. 使用列表輸入讀取GROUP,沒有制定長度,預設長度為8。
  2. 因為STRING是用一個informat讀取的,所以長度被設定為informat寬度3。
  3. LEFT和RIGHT都是用賦值語句建立的。因此,這兩個變數的長度等於等號後面的字面值中的位元組數。
  4. 注意,如果一個變數在資料步驟中出現多次,其長度由對該變數的第一次引用決定。
  5. 確保為字元變數分配適當的長度,最好的方法可能是使用length語句。

二、常用函式介紹

一些通用規則

  1. 如果沒有指定長度,那麼結果的長度與引數長度一致。
  2. character-value:任何SAS字元表示式
  3. 全域性巨集變數_CHARACTER_:資料集中所有字元變數

1、改變字元大小寫的函式

UPCASE(character-value):	將所有字母更改為大寫
LOWCASE(character-value):	將所有字母更改為小寫
PROPCASE(character-value):	將字串中每個單詞的第一個字母大寫

注意:PROPCASE以空格來區分不同單詞

舉例:

CHAR = "ABCxyz"
Function Returns
——————————————————————————————
UPCASE(CHAR) "ABCXYZ"

UPCASE("a1%m?") "A1%M?"
LOWCASE(CHAR) "abcxyz"
LOWCASE("A1%M?") "a1%m?"
PROPCASE(CHAR) "Abcxyz"
PROPCASE("a1%m?") "A1%m?"
PROPCASE("mr. george w. bush") "Mr. George W. Bush"

2、從字串中移除字元的函式

COMPBL(character-value):                     (壓縮空格)可以用一個空格替換多個空格。
COMPRESS(character-value <,'compress-list'>):從字元值中刪除指定的字元。

注意:

compress-list:

  • 是要刪除的字元的可選列表。
  • 如果省略此引數,則要刪除的預設字元為空格。
  • 如果包含要刪除的值列表,則只會刪除這些字元。
  • 如果列表中沒有包含空格,則空格將不會被刪除。

舉例:

CHAR = "A C XYZ"
Function Returns
——————————————————————————————————————————————————————————
COMPBL(CHAR) "A C XYZ"
COMPBL("X Y Z LAST") "X Y Z LAST"
——————————————————————————————————————————————————————————


CHAR = "A C123XYZ"
Function Returns
——————————————————————————————————————————————————————————
COMPRESS("A C XYZ") "ACXYZ"
COMPRESS("(908) 777-1234"," (-)") "9087771234"
COMPRESS(CHAR,"0123456789") "A CXYZ"

3、查詢字元、字串的函式

ANYALNUM(character-value <,start>):定位第一個出現的字母數字字元並返回其位置。如果沒有找到,函式返回0。
NOTALNUM(character-value <,start>)

ANYALPHA(character-value <,start>):定位第一個出現的阿爾法字元(任何大寫或小寫字母)並返回其位置。如果沒有找到,函式返回0。
NOTALPHA(character-value <,start>)

ANYDIGIT(character-value <,start>):定位第一個出現的數字(numeric)並返回其位置。如果沒有找到,函式返回0。
NOTDIGIT(character-value <,start>)

ANYPUNCT(character-value <,start>):定位第一個出現的標點字元並返回其位置。如果沒有找到,函式返回0。

ANYSPACE(character-value <,start>):定位第一次出現的空格、水平或垂直製表符、回車、換行和換頁並返回其位置。如果沒有找到,函式返回0。

NOTUPPER(character-value <,start>):定位第一個字串中非大寫字母的字元的位置。如果沒有找到,函式返回0。

注意:

start:指定開始搜尋的字串位置。預設從字串的開頭開始。

  • 如果start^=0,則從該數字的絕對值在字串中的位置開始搜尋。
  • 如果start>0,則從左到右進行搜尋;
  • 如果start<0,則從右到左進行搜尋。
  • 如果start>字串長度的負值,會導致從右向左的掃描,從字串的末尾開始。
  • 如果start>字串長度的正數,如果是0,函式返回0。

標點符號:
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
注意:

  • find-string:一個字元變數或字串文字
  • modifiers:

i:忽略大小寫
t:忽略find-string中的尾隨空格。

舉例:

STRING = "ABC 123 ?xyz_n_";
Function Returns
——————————————————————————————————————————————————————————
ANYALNUM(STRING) 1 (position of "A")
ANYALNUM("??%%") 0 (no alpha-numeric characters)
ANYALNUM(STRING,5) 5 (position of "1")
ANYALNUM(STRING,-4) 3 (position of "C")
ANYALNUM(STRING,6) 6 (position of "2")
NOTALNUM(STRING) 4 (position of the 1st blank)
NOTALNUM("Testing123") 0 (all alpha-numeric values)
NOTALNUM("??%%") 1 (position of the "?")
NOTALNUM(STRING,5) 8 (position of the 2nd blank)
NOTALNUM(STRING,-6) 4 (position of the 1st blank)
NOTALNUM(STRING,8) 9 (position of the "?")
——————————————————————————————————————————————————————————
ANYALPHA(STRING) 1 (position of "A")
ANYALPHA("??%%") 0 (no alpha characters)
ANYALPHA(STRING,5) 10 (position of "x")
ANYALPHA(STRING,-4) 3 (position of "C")
ANYALPHA(STRING,6) 10 (position of "x")
NOTALPHA(STRING) 4 (position of 1st blank)
NOTALPHA("ABCabc") 0 (all alpha characters)
NOTALPHA("??%%") 1 (position of first "?")
NOTALPHA(STRING,5) 5 (position of "1")
NOTALPHA(STRING,-10) 9 (start at position 10 and search left, position of "?")
NOTALPHA(STRING,2) 4 (position of 1st blank)
——————————————————————————————————————————————————————————
ANYDIGIT(STRING) 5 (position of "1")
ANYDIGIT("??%%") 0 (no digits)
ANYDIGIT(STRING,5) 5 (position of "1")
ANYDIGIT(STRING,-4) 0 (no digits from position 4 to 1)
ANYDIGIT(STRING,6) 6 (position of "2")
NOTDIGIT(STRING) 1 (position of "A")
NOTDIGIT("123456") 0 (all digits)
NOTDIGIT("??%%") 1 (position of "?")
NOTDIGIT(STRING,5) 8 (position of 2nd blank)
NOTDIGIT(STRING,-6) 4 (position of 1st blank)
NOTDIGIT(STRING,6) 8 (position of 2nd blank)
——————————————————————————————————————————————————————————
ANYSPACE(STRING) 4 (position of the first blank)
ANYSPACE("??%%") 0 (no spaces)
ANYSPACE(STRING,5) 8 (position of the second blank)
ANYSPACE(STRING,-4) 4 (position of the first blank)
ANYSPACE(STRING,6) 8 (position of the second blank)
——————————————————————————————————————————————————————————


STRING = "A!C 123 ?xyz_n_";
Function Returns
——————————————————————————————————————————————————————————
ANYPUNCT(STRING) 2 (position of "!")
ANYPUNCT("?? %%") 1 (position of "?")
ANYPUNCT(STRING,5) 9 (position of "?")
ANYPUNCT(STRING,-4) 2 (starts at position 4 and goes left, positionof "!" )
ANYPUNCT(STRING,-3) 2 (starts at "C" and goes left, position of "!")

——————————————————————————————————————————————————————————


STRING = "ABC 123 ?xyz_n_";
Function Returns
——————————————————————————————————————————————————————————
NOTUPPER("ABCDabcd") 5 (position of "a")
NOTUPPER("ABCDEFG") 0 (all uppercase characters)
NOTUPPER(STRING) 4 (position of 1st blank)
NOTUPPER("??%%") 1 (position of "?")
NOTUPPER(STRING,5) 5 (position of "1")
NOTUPPER(STRING,-6) 6 (position of "2")
NOTUPPER(STRING,6) 6 (position of "2")
——————————————————————————————————————————————————————————

DATA ANYWHERE;
	INPUT STRING $CHAR20.;
	ALPHA_NUM   = ANYALNUM(STRING);
	ALPHA_NUM_9 = ANYALNUM(STRING,-999);
	ALPHA       = ANYALPHA(STRING);
	ALPHA_5     = ANYALPHA(STRING,-5);
	DIGIT       = ANYDIGIT(STRING);
	DIGIT_9     = ANYDIGIT(STRING,-999);
	PUNCT       = ANYPUNCT(STRING);
	SPACE       = ANYSPACE(STRING);
DATALINES;
Once upon a time 123
HELP!
987654321
;
RUN;

結果:

注:第2行和第3行中第一個空格的位置分別是6和10。

STRING ALPHA_NUM ALPHA_NUM_9 ALPHA ALPHA_5 DIGIT DIGIT_9 PUNCT SPACE
——————————————————————————————————————————————————————————————————————————————————————————————————
Once upon a time 123 1 20 1 4 18 20 0 5
HELP! 1 4 1 4 0 0 5 6
987654321 1 9 0 0 1 9 0 10

FIND/FINDC(character-value, find-string <,'modifiers'> <,start>)
在字串中搜索給定的子字串/字元。可以根據起始位置、搜尋的方向、忽略大小寫、是否尾隨空格進行搜尋。

注意:

find-string:一個字元變數或字串文字
modifiers:
i:忽略大小寫
t:忽略find-string中的尾隨空格。
C-v:反向查詢
C-o:find-string中的引數只是用一次,之前不再重讀find-string變數,詳見例子

舉例:

STRING1 = "Hello hello goodbye" and STRING2 = "hello"
Function Returns
——————————————————————————————————————————————————————————
FIND(STRING1, STRING2) 7
FIND(STRING1, STRING2, 'I') 1
FIND(STRING1,"bye") 17
FIND("abcxyzabc","abc",4) 7
FIND(STRING1, STRING2, "i", -99) 7
——————————————————————————————————————————————————————————
STRING1 = "Apples and Books" and STRING2 = "abcde"
Function Returns
——————————————————————————————————————————————————————————
FINDC(STRING1, STRING2) 5
FINDC(STRING1, STRING2, 'i') 1
FINDC(STRING1,"aple",'vi') 6
FINDC("abcxyzabc","abc",4) 7
——————————————————————————————————————————————————————————

DATA O_MODIFIER;
    INPUT STRING $15.
    @16 LOOK_FOR $1.;
    POSITION = FINDC(STRING,LOOK_FOR,'IO');
DATALINES;
Capital A here A
Lower a here X
Apple B
;
PROC PRINT DATA=O_MODIFIER NOOBS HEADING=H;
    TITLE "Listing of Data Set O_MODIFIER";
RUN;

結果:
STRING LOOK_FOR POSITION
——————————————————————————————————————————————————————————
Capital A here A 2
Lower a here X 7
Apple B 1
——————————————————————————————————————————————————————————

INDEX(character-value, find-string):	在字串中搜索給定的子字串/字元。
										可以根據起始位置、搜尋的方向、忽略大小寫、是否尾隨空格進行搜尋。
INDEXC(character-value, 'char1','char2','char3',...)
INDEXC(character-value, 'char1char2char3. . .')
INDEXW(character-value, find-string):   在一個字串中搜索一個單詞(空格、字串的開始、字串的結束)分隔的一組字母。注意,標點符號不被認為是單詞邊界。

舉例:

STRING = "ABCDEFG";
Function Returns
——————————————————————————————————————————————————————————
INDEX(STRING,'C') 3 (the position of the 'C')
INDEX(STRING,'DEF') 4 (the position of the 'D')
INDEX(STRING,'X') 0 (no "X" in the string)
INDEX(STRING,'ACE') 0 (no "ACE" in the string)
INDEXC(STRING,'F','C','G') 3 (position of the "C")
INDEXC(STRING,'FCG') 3 (position of the "C")
INDEXC(STRING,'X','Y','Z') 0 (no "X", "Y", or "Z" in STRING)
——————————————————————————————————————————————————————————
STRING1 = "there is a the here" and STRING2 = "end in the."
Function Returns
——————————————————————————————————————————————————————————
INDEXW(STRING1,"the") 12 (the word "the")
INDEXW("ABABAB","AB") 0 (no word boundaries around "AB")
INDEXW(STRING1,"er") 0 (not a word)
INDEXC(STRING2,"the") 0 (punctuation is not a word boundary)

VERIFY(character-value, verify-string):檢查字串是否包含任何不需要的值。

舉例:

STRING = "ABCXABD" and V = "ABCDE"
Function Returns
——————————————————————————————————————————————————————————
VERIFY(STRING,V) 4 ("X" is not in the verify string)
VERIFY(STRING,"ABCDEXYZ") 0 (no "bad" characters in STRING)
VERIFY(STRING,"ACD") 2 (position of the "B")
VERIFY("ABC ","ABC") 4 (position of the 1st blank)
VERIFY(TRIM("ABC "),"ABC") 0 (no invalid characters)

4、提取部分字串的函式

SUBSTR(character-value, start <,length>):提取字串的一部分。當SUBSTR函式在等號的左側使用時,它可以將指定的字元放入現有字串中。

注意:

length: 為提取部分字串的字元數。

如果省略此引數,SUBSTR函式將返回從字串開始位置到字串結束的所有字元。

if start<0,start=|start|;

length<0或length=0,函式將返回一個長度為0的字串。

SUBSTR(character-value, start <,length>) = character-value:將一個或多個字元放入現有字串中。

注意

length:是要放置在該字串中的字元數。
如果省略length,則等號右邊的所有字元替換character-value中的字元。

if start<0,start=|start|;

length<0或length=0,函式將返回一個長度為0的字串。

舉例:

5、連線兩個或多個字串的函式

CALL CATS(result, string-1 <,string-n>):           連線之前刪除開頭和結尾空白-S
CALL CATT(result, string-1 <,string-n>):           只刪除尾部空格-
CALL CATX(separator, result, string-1 <,string-n>):連線之前刪除開頭和結尾空白,並預設以空格拼接-X
CAT(string-1, string-2 <,string-n>):               保持string-1的所有空格,與連線符||相同

注意:

call 提高了效能。例如,CALL CATS(R, X, Y, Z)比R = CATS(R, X, Y, Z)快。
result:該變數如果長度不夠,則會發生截斷
如果是新變數,則儲存拼接後的字串;
如果是已存在的變數,側該變數的首尾空格刪除後,將結果拼接到該變數中。
string-n:是要連線的字串。在連線之前,前導和尾隨空格將被刪除。
separator:分隔符;可以是字串,用來拼接string-n。預設用空格。


以上函式可以通過連線符||,函式strip,trim,left代替
非call 的函式返回值,如果不定義長度,則預設為200.

舉例:

A = "Bilbo" (no blanks)
B = " Frodo" (leading blanks)
C = "Hobbit " (trailing blanks)
D = " Gandalf " (leading and trailing blanks)
C1-C5是五個字元變數,分別為'A'、'B'、'C'、'D'和'E'。

Function Returns
——————————————————————————————————————————————————————————
CALL CATS(RESULT, A, B) "BilboFrodo"
CALL CATS(RESULT, B, C, D) "FrodoHobbitGandalf"
CALL CATS(RESULT, "Hello", D) "HelloGandalf"
CALL CATT(RESULT, A, B) "Bilbo Frodo"
CALL CATT(RESULT, B, C, D) " FrodoHobbit Gandalf"
CALL CATT(RESULT, "Hello", D) "Hello Gandalf"
CALL CATX(" ", RESULT, A, B) "Bilbo Frodo"
CALL CATX(",", RESULT, B, C, D) "Frodo,Hobbit,Gandalf"
CALL CATX(":", RESULT, "Hello", D) "Hello:Gandalf"
CALL CATX(", ", RESULT, "Hello", D) "Hello, Gandalf"
CALL CATX("***", RESULT, A, B) "Bilbo***Frodo"
CAT(A, B) "Bilbo Frodo"
CAT(B, C, D) " FrodoHobbit Gandalf "
CAT("Hello", D) "Hello Gandalf "
CAT(OF C1-C5) "ABCDE"
CATS(A, B) "BilboFrodo"
CATS(B, C, D) "FrodoHobbitGandalf"
CATS("Hello", D) "HelloGandalf"
CATS(OF C1-C5) "ABCDE"
CATT(A, B) "Bilbo Frodo"
CATT(B, C, D) " FrodoHobbit Gandalf"
CATT("Hello", D) "Hello Gandalf"
CATT(OF C1-C5) "ABCDE"
CATX(" ", A, B) "Bilbo Frodo"
CATX(":"B, C, D) "Frodo:Hobbit:Gandalf"
CATX("***", "Hello", D) "Hello***Gandalf"
CATX("," ,OF C1-C5) "A,B,C,D,E"
——————————————————————————————————————————————————————————
RESULT = " 123 "(leading and trailing blanks)
Function Returns
——————————————————————————————————————————————————————————
CALL CATS(RESULT, A, B) "123BilboFrodo"
CALL CATS(RESULT, B, C, D) "123FrodoHobbitGandalf"
CALL CATS(RESULT, "Hello", D) "123HelloGandalf"
CALL CATT(RESULT, A, B) " 123Bilbo Frodo"
CALL CATT(RESULT, B, C, D) " 123 FrodoHobbit Gandalf"
CALL CATT(RESULT, "Hello", D) " 123Hello Gandalf"
CALL CATX(" ", RESULT, A, B) "123 Bilbo Frodo"
CALL CATX(",", RESULT, B, C, D) "123,Frodo,Hobbit,Gandalf"
CALL CATX(":", RESULT, "Hello", D) "123:Hello:Gandalf"
CALL CATX(", ", RESULT, "Hello", D) "123, Hello, Gandalf"
CALL CATX("***", RESULT, A, B) "123***Bilbo***Frodo"

6、從字串中刪除空格的函式

LEFT(character-value): 函式會將第一個非空格字元移到第一個位置,並將多餘的空格移到末尾;
right(character-value):函式將把非空格文字移到右邊,把多餘的空格移到左邊。
TRIM(character-value): 刪除尾部空格。返回的變數的長度將與實參的長度相同,除非這個變數的長度已經在前面定義過。
TRIMN(character-value):同上
STRIP(character-value):去掉首尾空格。

注意:

如果TRIM函式的結果被賦值給一個長度比TRIM引數長的變數,得到的變數將被填充空白。
TRIM和TRIMN之間的區別是,TRIM函式為一個空白字串返回一個空白,而TRIMN返回一個空字串(零空白)。

舉例:

STRING1 = " ABC"
STRING2 = "ABC "
STRING3 = "ABC "
STRING4 = " XYZ"
STRING = " abc "

Function Returns
——————————————————————————————————————————————————————————
LEFT(STRING1) "ABC "
LEFT(" 123 ") "123 "
RIGHT(STRING2) " ABC"
RIGHT(" 123 ") " 123"
TRIM(STRING3) "ABC"
TRIM(STRING4) " XYZ"
TRIM("A B C ") "A B C"
TRIM("A ") || TRIM("B ") "AB"
TRIM(" ") " " (length = 1)
TRIM(" ") "" (length = 0)
STRIP(STRING) "abc" (如果之前為result分配的長度為3,則會新增尾隨空格)
STRIP(" LEADING AND TRAILING ") "LEADING AND TRAILING"

7、比較字串的函式

COMPARE(string-1, string-2 <,'modifiers'>):                       根據modifiers比較兩個字串;相同返回0,不同則返回不同的位數,正負取決於ASCII碼的前後。
CALL COMPCOST('operation-1', cost-1 <,'operation-2', cost-2 ...>):確定兩個字串之間的相似性,使用一種稱為廣義編輯距離的方法。
COMPGED(string-1, string-2 <,maxcost> <,'modifiers'>):            計算兩個字串之間的相似度
COMPLEV(string-1, string-2 <,maxcost> <,'modifiers'>):            計算兩個字串之間的相似度
SOUNDEX(character-value):                                         建立與文字字串等價的語音字串。通常用於嘗試匹配可能有一些拼寫差異的名稱。
SPEDIS(word-1, word-2):                                           計算兩個單詞之間的拼寫距離。兩個單詞越相似,得分越低。分數為0表示精確匹配。

注意:

modifiers:
I:忽略大小寫
L:刪除引導空格
N:一般用於無效的SAS名。
:(冒號):截斷較長的字串,長度為較短的字串的長度。等同於=:

舉例:

string1 = "AbC"
string2 = " ABC"
string3 = " 'ABC'n"
string4 = "ABCXYZ"

Function Returns
——————————————————————————————————————————————————————————
COMPARE(string1,string4) 2 ("B" comes before "b")
COMPARE(string4,string1) -2
COMPARE(string1,string2,'i') 1
COMPARE(string1,string4,':I') 0
COMPARE(string1,string3,'nl') 4
COMPARE(string1,string3,'ln') 1

8、將字串劃分為“單詞”的函式

SCAN(character-value, n-word <,'delimiter-list'>):     從字元表示式中提取指定的單詞,其中單詞定義為由一組指定的分隔符分隔的字元。
SCANQ(character-value, qn-word <,'delimiter-list'>):
CALL SCAN(character-value, n-word, position, length <,'delimiter-list'>)
CALL SCAN(character-value, n-word, position, length <,'delimiter-list'>)

注意:

1、返回變數的長度為200,除非前面定義過。
2、n-word:是字串中的第n個“單詞”;
如果n大於單詞數,則返回一個不包含字元的值。
如果n為負數,則從右向左掃描字元值。值為零無效。
n-word是字串中的第n個“單詞”。
如果n為負,則從右向左進行掃描。
如果n大於單詞數或0,SCANQ函式將返回一個空白值。
位於第一個單詞之前或最後一個單詞之後的分隔符將被忽略。
如果兩個或多個分隔符位於兩個單詞之間,則將它們視為一個分隔符。
如果字元值包含一組引號,則忽略這些引號內的任何分隔符。
3、delimiter-list: 可選引數。如果省略,則預設定界符集為(對於ASCII環境):空格 . < ( + & ! $ * ) ; ^ - / , % |
第一個單詞之前的分隔符不起作用。兩個或多個連續分隔符被視為一個。

舉例:

STRING1 = "ABC DEF"
STRING2 = "ONE?TWO THREE+FOUR|FIVE"

Function Returns
——————————————————————————————————————————————————————————
SCAN(STRING1,2) "DEF"
SCAN(STRING1,-1) "DEF"
SCAN(STRING1,3) no characters
SCAN(STRING2,4) "FIVE"
SCAN(STRING2,2," ") "THREE+FOUR|FIVE"
SCAN(STRING1,0) An error in the SAS log
——————————————————————————————————————————————————————————
STRING1 = "ABC DEF"
STRING2 = "ONE TWO THREE FOUR FIVE"
STRING3 = "'AB CD' 'X Y'"
STRING4 = "ONE# ::TWO"

Function Returns
——————————————————————————————————————————————————————————
SCANQ(STRING1,2) "DEF"
SCANQ(STRING1,-1) "DEF"
SCANQ(STRING1,3) no characters
SCANQ(STRING2,4," ") "FOUR"
SCANQ(STRING3,2) "'X Y'"
SCANQ(STRING1,0) no characters
SCANQ(STRING4,2," #:") "TWO"
CALL SCAN(STRING1,2,POSITION,LENGTH) 5 3
CALL SCAN(STRING1,-1,POSITION,LENGTH) 5 3
CALL SCAN(STRING1,3,POSITION,LENGTH) 0 0
CALL SCAN(STRING2,1,POSITION,LENGTH) 1 7
CALL SCAN(STRING2,4,POSITION,LENGTH) 20 4
CALL SCAN(STRING2,2,POSITION,LENGTH," ") 9 15
CALL SCAN(STRING1,0,POSITION,LENGTH) missing missing
CALL SCANQ(STRING1,2,POSITION,LENGTH) 5 3
CALL SCANQ(STRING1,-1,POSITION,LENGTH) 5 3
CALL SCANQ(STRING1,3,POSITION,LENGTH) 0 0
CALL SCANQ(STRING2,4,POSITION,LENGTH) 5 3
CALL SCANQ(STRING2,2,POSITION,LENGTH," ") 9 15
CALL SCANQ(STRING1,0,POSITION,LENGTH) 0 0
CALL SCANQ(STRING3,2,POSITION,LENGTH) 9 5

9、用於替換字串中的字母或單詞的函式

TRANSLATE(character-value, to-1, from-1 <,… to-n, from-n>):用一個字元值交換另一個字元值。from-n中列出的每個字元都被更改為to-n中相應的值。如果字元值沒有在-n中列出,它將不受影響。
															例如,您可能希望將值1-5更改為值A-E。
TRANWRD(character-value, from-string, to-string):

注意:

to-n:一個單個字元或一列字元值。
from-n:單個字元或字元列表。
from-string:一個或多個您想要替換為字串中的一個或多個字元的字元。
to-string:替換整個from-string的一個或多個字元。

舉例:

CHAR = "12X45", ANS = "Y"
STRING = "123 Elm Road"
FROM = "Road"
TO = "Rd."

Function Returns
——————————————————————————————————————————————————————————————————————
TRANSLATE(CHAR,"ABCDE","12345") "ABXDE"
TRANSLATE(CHAR,'A','1','B','2','C','3','D','4','E','5') "ABXDE"
TRANSLATE(ANS,"10","YN") "1"
TRANWRD(STRING,FROM,TO) "123 Elm Rd."
TRANWRD("Now is the time","is","is not") "Now is not the time"
TRANWRD("one two three","four","4") "one two three"
TRANWRD("Mr. Rogers","Mr."," ") " Rogers"
TRANWRD("ONE TWO THREE","ONE TWO","A B") "A B THREE"

10、計算字串長度的函式

LENGTH(character-value): 確定字元值的長度,不包括尾隨空格。null引數返回值為1。
LENGTHN(character-value):確定字元值的長度,不包括尾隨空格。null引數返回值為0。
LENGTHC(character-value):確定字元值(包括尾隨空格)的長度
LENGTHM(character-value):確定記憶體中字元變數的長度。

舉例:

CHAR = "ABC "
Function Returns
——————————————————————————————————————————————————————————
LENGTH("ABC") 3
LENGTH(CHAR) 3
LENGTH(" ") 1
LENGTH("ABC") 3
LENGTH(CHAR) 3
LENGTH(" ") 0
LENGTHC("ABC") 3
LENGTHC(CHAR) 6
LENGTHC(" ") 1
LENGTHM("ABC") 3
LENGTHM(CHAR) 6
LENGTHM(" ") 1

11、計算字串中字母或子字串數量的函式

COUNT(character-value, find-string <,'modifiers'>):計算給定子字串在字串中出現的次數,如果沒有找到該子字串,函式將返回0
COUNTC(character-value, characters <,'modifiers'>):

注意:

modifiers:
I:忽略大小寫
T:忽略尾部空格。

舉例:

STRING1 = "How Now Brown COW" and STRING2 = "ow"
Function Returns
——————————————————————————————————————————————————————————
COUNT(STRING1, STRING2) 3
COUNT(STRING1,STRING2,'I') 4
COUNT(STRING1, "XX") 0
COUNT("ding and dong","g ") 1
COUNT("ding and dong","g ","T") 2

COUNTC("AaBbbCDE","CBA") 3
COUNTC("AaBbbCDE","CBA",'I') 7
COUNTC(STRING1, STRING2) 6
COUNTC(STRING1,STRING2,'I') 8
COUNTC(STRING1, "XX") 0
COUNTC("ding and dong","g ") 4 (2 g's and 2 blanks)
COUNTC("ding and dong","g ","T") 2 (blanks trimmed)
COUNTC("ABCDEabcde","BCD",'VI') 4 (A, E, a, and e)

12、其他字串的函式

MISSING(variable):         確定引數是否缺失(字元或數字)值。如果該值是缺失值,則返回1 (true),否則返回0 (false)。
RANK(letter):              獲取ASCII(或EBCDIC)字元的相對位置。
REPEAT(character-value, n):複製一個字串的多個副本。
REVERSE(character-value):  顛倒字元值的文字順序。

注意:

如果您想要將每個字元與數字關聯起來,以便陣列的下標可以指向特定的字元,RANK是非常有用的。

舉例:

NUM1 = 5, NUM2 = ., CHAR1 = "ABC", and CHAR2 = " "
Function Returns
——————————————————————————————————————————————————————————
MISSING(NUM1) 0
MISSING(NUM2) 1
MISSING(CHAR1) 0
MISSING(CHAR2) 1
——————————————————————————————————————————————————————————
STRING1 = "A" and STRING2 = "XYZ"
Function Returns
——————————————————————————————————————————————————————————
RANK(STRING1) 65
RANK(STRING2) 88
RANK("X") 88
RANK("a") 97
——————————————————————————————————————————————————————————
STRING = "ABC"
Function Returns
——————————————————————————————————————————————————————————
REPEAT(STRING,1) "ABCABC"
REPEAT("HELLO ",3) "HELLO HELLO HELLO HELLO"
REPEAT("*",5) "******"
——————————————————————————————————————————————————————————
STRING1 = "ABCDE" and STRING2 = "XYZ "
Function Returns
——————————————————————————————————————————————————————————
REVERSE(STRING1) "EDCBA"
REVERSE(STRING2) " ZYX"
REVERSE("1234") "4321"