if _n_ = 1则使用之间的区别;并且不与SAS中的PRXPARSE()一起使用

时间:2020-07-03 08:04:02

标签: sas

创建了一个数据集:

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;

两个测试代码都给出了相同的结果。它们之间有什么区别?

2 个答案:

答案 0 :(得分:1)

具有该构造的DATA步骤代码块

if _n_ = 1 then do;
   ... 
end;

使内部语句仅在隐式循环的第一次迭代期间发生。

Retain对(非DATA SET)变量进行操作可防止其值在隐式循环的顶部重置为丢失。保留可用于在编译时使用文字值初始化变量,并且不需要if _n_=1防护。通过计算分配或INPUT进行的初始化必然需要防护措施(prxparse等特殊情况除外)。

对于内部声明re = prxparse(...)

如@whymath所述,在每个SAS版本中都对DATA Step编译器进行了改进,现在有一些隐式防护措施可以防止重新编译静态正则表达式模式。

您将看到用于初始化hash对象的相同代码构造。

每日提示:

  • 如果未指定参数,则RETAIN语句将使从INPUT或赋值语句创建的所有变量的值从DATA步骤的一次迭代保留到下一次。 / li>

答案 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方法。