创建了一个数据集:
data x;
infile datalines truncover;
input name $100.;
datalines;
Deepanshu
How are you, deepanshu
dipanshu
deepanshu is a good boy
My name is deepanshu
Deepanshu Bhalla
Deepanshuuu
DeepanshuBhalla
Bhalla Deepanshu
;
run;
编写以下代码:
data test;
set x;
if _n_ =1 then do;
retain re;
re = prxparse("s/(Deepanshu\s?Bhalla|bhalla\s?Deepanshu|Deepanshu)/Soumya Pandey/i");
end;
new_data = prxchange(re, -1, name);
proc print;
run;
和类似的但没有
if _n_ =1 then do; end; retain;
data test;
set x;
re = prxparse("s/(Deepanshu\s?Bhalla|bhalla\s?Deepanshu|Deepanshu)/Soumya Pandey/i");
new_data = prxchange(re, -1, name);
proc print;
run;
两个测试代码都给出了相同的结果。它们之间有什么区别?
答案 0 :(得分:1)
具有该构造的DATA步骤代码块
if _n_ = 1 then do;
...
end;
使内部语句仅在隐式循环的第一次迭代期间发生。
Retain
对(非DATA SET)变量进行操作可防止其值在隐式循环的顶部重置为丢失。保留可用于在编译时使用文字值初始化变量,并且不需要if _n_=1
防护。通过计算分配或INPUT
进行的初始化必然需要防护措施(prxparse
等特殊情况除外)。
对于内部声明re = prxparse(...)
如@whymath所述,在每个SAS版本中都对DATA Step编译器进行了改进,现在有一些隐式防护措施可以防止重新编译静态正则表达式模式。
您将看到用于初始化hash
对象的相同代码构造。
每日提示:
答案 1 :(得分:0)
第一个使用if _n_ = 1 then ...; retain ;
语句,这是一种非常好的实用编程技术,称为初始化块。它将仅在读取数据时在第一行执行,并且避免为数据步骤的每次迭代编译正则表达式。
但是,此技能可能被认为是过时的。在非常新的SAS版本中(我的是SAS9.4M5),我们不再需要编写此初始化块,而是进行了一些内部解析器优化。这是来自SAS Help Center的规范:
如果perl-regular-expression是常量或使用/ o选项,则Perl正则表达式仅被编译一次。连续调用PRXPARSE不会导致重新编译,但是会返回已编译的正则表达式的regular-expression-id。此行为简化了代码,因为您不需要使用初始化块(IF _N_ = 1)来初始化Perl正则表达式。
所以我更喜欢使用第二种方法,这是真正的SASor方法。