SAS是否在CALL SYMPUT变量名中添加空格?

SAS是否在CALL SYMPUT变量名中添加空格?,sas,Sas,新的SAS用户 我现在正在学习使用/编写宏。我试图在数据集“ZonelList”中循环遍历可变区域,并计算数据集中的观察数。这是我的密码: data _null_; set zonelist; call symput ('zone'||_n_, zone); call symput ('numzones', _n_); run; 我希望这会创建变量“zone1”、“zone2”等,以便在do循环中调用它们。这是一个合理的方法,对吗?无论如何,SAS似乎在给我的变

新的SAS用户

我现在正在学习使用/编写宏。我试图在数据集“ZonelList”中循环遍历可变区域,并计算数据集中的观察数。这是我的密码:

data _null_;
    set zonelist;
    call symput ('zone'||_n_, zone);
    call symput ('numzones', _n_);
    run;
我希望这会创建变量“zone1”、“zone2”等,以便在do循环中调用它们。这是一个合理的方法,对吗?无论如何,SAS似乎在给我的变量名添加空格。我在运行时遇到此错误:

ERROR: Symbolic variable name ZONE           1 must contain only
letters, digits, and underscores. NOTE: Invalid argument to function
SYMPUT('zone        '[12 of 16 characters shown],'100         '[12 of
16 characters shown]) at line 567 column 10. zone=100 _ERROR_=1 _N_=1

当然,对于我的数据集中的每个观察,我都会得到相同的错误。为什么表中的区域值会有一堆空格(我想变量是$16),这是有道理的,但是为什么它会将所有的空格添加到我的变量名中呢?我错过了什么

这是由于
\n
变量的数字/字符转换造成的。当数值转换为字符时,它们是右对齐的

请尝试以下操作:

data _null_;
  set zonelist;
  call symputx(cats('zone',_n_), zone);
  call symputx('numzones', _n_);
run;
cats
功能将执行数字/字符转换,并去除前导空格

如果您有SAS 9,那么您也可以使用
symputX
函数从宏值中去除前导/尾随空格。

我使用“压缩”解决了它,只需删除所有空格:

data _null_;
  set zonelist;
  call symputx(compress('zone',_n_), zone);
  call symputx('numzones', _n_);
run;

然而,这并不能帮助我理解为什么我需要这么做。任何启示都将不胜感激

SAS有两种类型的变量,固定长度字符串和浮点数。让我们看看你的第一句话

call symput ('zone'||_n_, zone);
在这里,您引用了两个变量和一个字符串文本。由于
|
运算符作用于字符变量,因此SAS需要将数字变量
\n
隐式转换为字符串。SAS将使用
best12.
格式,因此它将产生类似
'1'
的值。因此,对于用于宏变量名的
call symput()
函数,您将得到一个无效值

但是第三个值,变量
区域
呢?如果zone是一个数字,则会发生相同的隐式转换,宏变量最终将包含前导空格。或者区域变量是一个字符串,在这种情况下,宏变量很可能会有尾随空格,除非区域值的长度恰好与变量区域定义为保持的最大长度匹配

正如其他人所建议的,要解决这个问题,有两件事要做

首先使用
call symputx()
而不是
call symput()
(除非您真的想在宏变量中存储这些尾随空格),它将自动
strip()
输入值。它还将消除隐式数字到字符转换的注意事项

第二种方法是使用某种方法生成不插入空格的宏变量名。最简单的方法是只使用
cats()
函数而不是
|
操作符。但您也可以使用其他函数的组合,如
put()
compress()
strip()
,等等

call symputx(cats('zone',_n_),zone);

嗯,这还是没用。查看日志,它似乎在“区域”的“区域”部分添加空白。我弄错了吗?如果我不是,那么“猫”或“脱衣舞”就不起作用了,因为空间在绳子的中间。我也试过脱衣舞(“区域”)之类的。我还没有找到一个解决办法,但一定是因为我不需要,而且我在这里遗漏了一些明显的东西?你怎么说它不起作用?你犯了什么错误?@Schwa,这应该行得通。请发布完整的日志。这不应该起作用:,其中
chars
被描述为“此列表中的字符已从源参数中删除”