SAS Macros in Datalines



关于在SAS中创建调用宏变量的数据集,我有两个问题

第1部分

我试图创建一个数据集,有一个字符变量称为变量的长度为100,和3个观察值。

%let first_value=10;
%let second_value=20;
%let third_value=30;
data temp;
infile cards truncover;
input variable $100.;
cards;
First Value: &first_value
Second Value: &second_value
Third Value: &third_value
;
run;

我的输出数据集不显示宏变量,只显示我在数据线中输入的确切文本。我很想帮助语法如何连接字符输入与宏变量。我也很好奇为什么有时候你需要在输入语句之前为字符变量单独的长度语句,而其他时候你可以像上面那样在输入语句中指定长度。

第2部分

接下来,我试图创建一个数据集,该数据集具有4个变量,其中3个是宏变量。

data temp2;
infile cards dlm="    "
input variable $ first_var second_var third_var
cards;
Observation 1 Filler    &first_value    &second_value    &third_value
;
run;

分隔符语句中的4个空格和数据线中变量之间的4个空格实际上是我代码中的制表符。

谢谢!

你的例子似乎不值得使用宏变量。

但是如果你真的需要解析变量值中的宏表达式,那么使用resolve()函数。RESOLVE()将计算文本中的所有宏代码,而不仅仅是示例中的宏变量引用。因此,任何宏函数调用和对实际宏的调用都将被解析,生成的文本将作为函数的结果返回。

newvar=resolve(oldvar);

所以你的例子变成:

data temp;
infile cards truncover;
input variable $100.;
variable = resolve(variable);
cards;
First Value: &first_value
Second Value: &second_value
Third Value: &third_value
;
data temp2;
infile cards dlm="|" ;
input @;
_infile_=resolve(_infile_);
input variable :$100. first_var second_var third_var ;
cards;
Observation 1 Filler|&first_value|&second_value|&third_value
;

但是在第二个上要小心,因为卡片图像的_INFILE_变量是80字节的固定倍数,所以如果解析的宏表达式使字符串长于下一个80字节边界,您将失去额外的文本。

511  %let xx=%sysfunc(repeat(----+----0,8));
512
513  data test;
514    infile cards truncover;
515    input @;
516    _infile_=resolve(_infile_);
517    input variable $100. ;
518    length=lengthn(variable);
519    put length= variable=;
520  cards;
length=5 variable=short
length=80 variable=long ----+----0----+----0----+----0----+----0----+----0----+----0----+----0----+
NOTE: The data set WORK.TEST has 2 observations and 2 variables.

所以使用来自实际文件的输入。这样,字符变量的限制就变成了32,767字节。

%let xx=%sysfunc(repeat(----+----0,8));
options parmcards=text;
filename text temp;
parmcards;
short
long &xx
;
531
532
533  data test;
534    infile text truncover;
535    input @;
536    _infile_=resolve(_infile_);
537    input variable $100. ;
538    length=lengthn(variable);
539    put length= variable=;
540  run;
NOTE: The infile TEXT is:
Filename=C:...#LN00053,
RECFM=V,LRECL=32767,File Size (bytes)=17,
Last Modified=08Jul2022:23:42:10,
Create Time=08Jul2022:23:42:10
length=5 variable=short
length=95 variable=long ----+----0----+----0----+----0----+----0----+----0----+----0----+----0----+----0----+----0
NOTE: 2 records were read from the infile TEXT.
The minimum record length was 5.
The maximum record length was 8.
NOTE: The data set WORK.TEST has 2 observations and 2 variables.

最新更新