2017-07-27 101 views
1

我正在閱讀「SAS函數示例 - 第二版」一書,並且由於其示例和輸出而難以理解某個函數。FINDC中的'k'修飾符如何在SAS中工作?

功能:FINDC
目的:查找出現或不出現在字符串中的字符。使用可選參數,您可以定義搜索的起點,設置搜索方向,忽略大小寫或尾隨空白,或查找除列出的字符以外的字符。

語法:FINDC(character-value, find-characters <,'modifiers'> <,start>)

修飾符的兩個是ik

i忽略不是在查找字符名單的情況下
k只計數字符

所以現在有一個例子是這樣的:

注:STRING1 =「蘋果和書籍」

FINDC(STRING1,"aple",'ki')

對於輸出,他們說,這將返回1因爲在蘋果「A」的位置。然而,這讓我感到困惑,因爲我認爲k修飾符說在查找字符列表中找到而不是的字符。那麼爲什麼當查找字符列表中的字母「A」被忽略,時,它尋找a。對我來說,我覺得這個例子應該輸出6作爲蘋果公司的「s」。

是否有人能夠幫助解釋我的k修飾符更好,爲什麼這個答案的輸出是1而不是6

編輯1

讀SAS documentation網上,我發現這個例子似乎矛盾的書我讀:

例3:在搜索字符和使用K修改
本示例搜索字符串,並返回字符列表中不出現的字符,其中 不會出現在字符列表中。

data _null_; 
    string = 'Hi, ho!'; 
    charlist = 'hi'; 
    j = 0; 
    do until (j = 0); 
     j = findc(string, charlist, "k", j+1); 
     if j = 0 then put +3 "That's all"; 
     else do; 
     c = substr(string, j, 1); 
     put +3 j= c=; 
     end; 
    end; 
run; 

SAS writes the following output to the log: 
    j=1 c=H 
    j=3 c=, 
    j=4 c= 
    j=6 c=o 
    j=7 c=! 
    That's all 

那麼,是書錯了嗎?

+1

這是內部一致性最終導致某些事情沒有多大意義的情況之一。 'k'這樣做是因爲它首先在'compress'中出現,它告訴compress而不是刪除[list]中的字符,它應該'保持'它們。在這裏沒有任何意義,因爲它已經意味着這在'壓縮',它保證我們不會有任何其他衝突... – Joe

回答

3

這本書是錯誤的。

511 data _null_; 
512 STRING1 = "Apples and Books" ; 
513 x=FINDC(STRING1,"aple",'ki'); 
514 put x=; 
515 if x then do; 
516  ch=char(string1,x); 
517  put ch=; 
518 end; 
519 run; 

x=6 
ch=s