【问题标题】:SAS Macros in Datalines数据线中的 SAS 宏
【发布时间】:2022-08-07 14:23:50
【问题描述】:

我有一个关于在 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 个空格和数据行中的变量之间实际上是我代码中的制表符。

谢谢!

  • 为什么?另外为什么数据行以 8 个空格开头?如果对此有一些需要,请查看 PROC STREAM。

标签: syntax sas sas-macro


【解决方案1】:

您的示例似乎不值得使用宏变量。

但是,如果您确实需要解析变量值中的宏表达式,请使用 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
;

但在第二个中要小心,因为 CARDS 图像的 _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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多