%scan用法知多少

2021-02-19 SAS中文論壇

在宏裡面,對於宏變量的解析是非常常見的一個語句,%scan也是比較常用的一個宏函數,尤其是在寫宏循環或者截取字符串時,通常都會用%scan函數來進行讀取。

%scan函數在SAS中不僅可以用於宏語句中,還可以用於普通的SAS語句中,包括data步和proc步。

下面簡單的說一下在這兩種情形下%scan的使用方法:

1.在宏語句中的使用:

這種用法是比較常見的,舉個簡單的例子,代碼如下所示:

%macro test;

%local var var1;

%let var = abc/def/gh;

%let var1 = %scan("&var.",1,/);

%put var1 = &var1.;

%mend;

%test;

最終我們得到的結果為:var1 = abc。

對於上述在宏語句中對宏變量結合宏函數進行解析,我們不需要加引號,直接解析就行。

那麼我們可以看看如果加了引號會出現什麼問題呢?

先將&var用雙引號」」括起來:

%let var1 = %scan("&var.",1,/);

最終日誌出現報錯:

 

出現這種報錯的原因是,當&var加上引雙號後,宏函數%scan需要截取的字符串就變成了」abc/def/gh」,那麼通過截取後,就變成了」abc這麼個字符串了,由於雙引號的不成雙,所以導致程序報錯,其實這種問題在宏裡面也會經常碰到,遇到這種特殊字符,為了避免它作為雙引號的作用,而把它看成一個普通字符,我們可以用%bquote函數來對它進行屏蔽。

通過如下代碼的方式:

%let var1 = %bquote(%scan("&var.",1,/));

只是最終我們得到的結果為:var1 = 「abc。

我們看到雙引號成單,並且在結果中現實顯示出來,但是日誌並沒有報錯。

接下來,我們將雙引號換成單引號,得到如下代碼:

%let var1 = %scan('&var.',1,/);

發現我們得到的結果為:var1 = 『&var.』。

這個很有意思哈,在宏變量解析裡面,如果對宏變量加了成雙的單引號,那麼宏變量就無法解析。那麼試想一下為了能夠讓他解析,同時單引號又不想去掉,怎麼辦呢?

還是%bquote函數,代碼如下:

%let var1 = %bquote(%scan('&var.',1,/));

這個時候發現我們得到的結果為:var1 = 『abc。

結果變成了帶成單的單引號了,究其原因還是在於宏函數%bquote屏蔽掉了單引號的作用,把它看成了普通的字符。關於宏函數對特殊字符的屏蔽我就不多說了,SASHELP中對於這類函數介紹的很詳細,大家可以去自行去看看。

另外囉嗦一下關於宏編譯和宏執行的區別,因為在宏函數對特殊字符的屏蔽也分為編譯時屏蔽和執行時屏蔽。

為了直白說明,給出下面兩行代碼吧:

%let var = %str(%"abc/def/gh);

%let var = %bquote("abc/def/gh);

第一行代碼中%str用於編譯時屏蔽,第二行代碼中%bquote用於執行時屏蔽,分別執行上述兩行代碼,發現第二行代碼會報錯,這就是編譯和執行的區別了。

當宏編譯時,引號發現不成雙,會報錯,而由於%str的屏蔽,程序不報錯,而%bquote由於只能在執行時屏蔽,而宏編譯時還沒執行,因此會報錯。

 

2.在普通SAS語句中的使用:

通常在普通SAS語句中,%scan用來解析宏變量獲取普通的SAS變量,例如:

%let var =abc/def/gh;

data _null_;

abc = 1;

var = %scan(&var.,1,/);

put var =;

run;

最終得到的結果為:var = 1。

這種語句下,切記不能加雙引號,一旦加了雙引號,程序就會報錯。

 

另外需要注意的是,不管是%scan還是scan函數,在對第三個參數進行設置時,需要記住參數是以字符作為間隔的,而不是以字符串作為間隔,例如:

%let var =abc/deg/fh*ge/;

data _null_;

fh = 1;

var = %scan(&var,3,*/);

put var =;

run;

終得到的結果為:var = 1。

從上述代碼知:當%scan截取第三個以」/」或者」*」為間隔的變量名fh,因此結果為1。

 


相關焦點

  • While的用法你知多少?
    While的用法你知多少?最近共學社開啟了互評的模式,雖然表面上是為他人評點,似乎費時費力,但實際上卻是獲益良多。
  • 動詞「make」用法知多少
    動詞「make」用法知多少貴陽市野鴨中學  寇豔用作及物動詞的「make」在英語中靈活多變、應用廣泛,因此歸納記憶相關知識點顯得尤為重要。
  • 'but'用法知多少
    「but」一詞是中學英語中的一個重要詞彙,為了幫助同學們更好地複習,現將其常見用法歸納如下:  1. 作連詞,可以連接兩個並列成分或兩個並列分句,意為「但是,然而」。如:  He is young but very experienced.
  • Would用法知多少
    以下表格歸納了would的一些典型用法:Would的用法例子備註禮貌請求I  would like some bread.Want的禮貌用法,也可接不定式禮貌邀約(一般用在問句中)Would  you like some rice or noodle?也可接不定式:Would you like to go?
  • How much,How many用法知多少
    2個都表示「多少」,是英語中使用頻率相當高的2個特殊疑問詞,但在用法上還是有著很大的區別。No.1 How much1、小學階段最早接觸到How much這個特殊疑問詞,我們知道它對價格提問,翻譯為「多少錢」。How much is this sweater?這件毛衣多少錢?
  • can用法知多少
    但是,can一詞是不是只有「能夠」這種用法?今天普特君為大家梳理一下can一詞的所有用法。一、用作情態動詞1.表示能力或者能夠發生:能,會I can swim very fast. 我能遊得很快。2.表示知道如何做:懂得,會She can speak English. 她會說英語。
  • 引號用法知多少
    最近在讀牛津的寫作手冊,翻譯整理了其中部分關於引號的用法:1.引號裡的句子首字母大寫She said, "We are
  • 法語副代詞en的用法你知多少
    用法可謂是千變萬化,你都掌握了嗎? ——小蝸牛 一般用法 1. 做副詞:代替de引導的地點狀語,「從...」 這有一些蘋果,您想要多少? - J'enveux un kilo. 我想要一公斤。
  • 配置Mcafee Virusscan中文企業版
    不盡然,有的網絡用戶還是採用了原始默認的規則配製,這樣的殺毒軟體只能發揮其半倍功效,就拿Mcafee Virusscan 8.0i來說,只要配合計算機埠策略即可達到病毒木馬遠離計算機的效果。    了解Mcafee Virusscan 8.0i    由於McAfee在防護能力上功能非常強大,用戶可以自行制定規則策略,並且總體性能穩定佔用系統資源少的特點深受網民喜愛。
  • 【乾貨】Allow用法知多少.
    生活,學習當中,看似一些簡單易懂的詞彙,但真的提到其地道的用法時,還是用的不夠精準。
  • otherwise用法知多少?
    otherwise這個單詞在英語文章中出現頻率也算比較高,但是用法更為複雜,而且某些時候不好理解,比如考研英語中出現過的幾個句子:
  • 朝花夕拾|feel用法知多少
    以上用法中,動詞feel是用在主動語態下,用於被動語態的情況有沒有呢?也有。在朗文6的詞典中,解釋了一種feel用於被動語態的情況:在較正式的英語中,可以用It is felt that……引出許多人認為之事,比如:▼It was felt right that the experiment should be stopped.
  • 中考來臨,to的用法知多少
    今天分享to的用法。在英語當中,to的用法很多。根深老師帶領大家來梳理一下知識點。你能說出幾個呢?其實我們學習,要學會歸納總結。1. 表示時間 在英語當中,表示幾點差幾分,用介詞to。固定用法give sb. sth=give sth to sb. 給某人某物show sb. sth.=show sth. to sb. 向某人看什麼東西pass sb. sth=pass sth to sb.
  • し的用法知多少?2個用法要知道
    ,只知道它和「~て、~て」的用法相似,但是卻沒有辦法完全分辨它們之間的差異,今天就讓我們一起來看看「~し、~し」的用法吧。01|助詞し的並列用法說起し,我們最經常看到的用法就是並列用法,如果我們只是和別人說並列,很多人可能不太能夠理解,那麼我們就用一個相對來說的漢語句型解釋,那就是「既~又~」的含義,再接續上「~し、~し」既可以接續普通體,也可以接續動詞的ます形,但是在「し」前面的通常放置的是同類型的詞彙:例如「動詞+し、動詞+し」、「名詞
  • advice的用法知多少
    今天我們分享advice的用法
  • R語言中使用scan函數從鍵盤中獲取數據
    scan函數默認使用格式輸入數據時指定分隔符scan(sep=",")1:Error in scan() : scan() expected 'a real', got 'I'(2)指定what參數scan(what='character')1: I Love China
  • 「can you scan me」是什麼意思?
    I scan you.我掃你。Can you scan me?你可以掃我嗎?Have you been to Australia before?
  • [總結]閱讀中as用法知多少
    想必關於as的用法,考生們在初高中就了解了很多,而且也可以在網絡上搜尋到大量的信息。
  • R語言中使用scan函數讀取文件中的數據
    在上一篇文章中介紹了使用scan函數從鍵盤中獲取數據的方法,本篇文章將介紹scan函數的另外一個常用功能:從文件中獲取數據。從文本文件中讀取數據假設在R的當前工作目錄中有一個文件:student.txt,其存儲的數據如下圖所示,每個數據以空格分隔。
  • Wrong的用法知多少?
    Wrong是英語中最常用的單詞之一,今天我們就來看一下這個貌似簡單的單詞的四種不同用法。