SAS 32字符列名问题

SAS 32字符列名问题,sas,sas-macro,Sas,Sas Macro,我试图遵守32个字符的列限制,当它们从源代码进入时重命名它们。问题是,通过使用下面的datastep,我得到了一个错误23-322:变量名超过32个字符错误 以下是我试图使用的: data mydata; set mydata; rename Thisisthelongcolumnnamefromthesourcetable = ShorterName; run; 我听说使用ds2可以解决这个问题,但每次使用ds2都会出现类似的错误。由于我无法直接控制源

我试图遵守32个字符的列限制,当它们从源代码进入时重命名它们。问题是,通过使用下面的datastep,我得到了一个错误23-322:变量名超过32个字符错误

以下是我试图使用的:

    data mydata;
    set mydata;
        rename Thisisthelongcolumnnamefromthesourcetable = ShorterName;
    run;
我听说使用ds2可以解决这个问题,但每次使用ds2都会出现类似的错误。由于我无法直接控制源数据,是否有解决此限制的方法

此外,SAS似乎会自动截断列的名称,但标签名称仍保持实际长度。有没有办法通过引用列名的标签名来更改列名


谢谢你的帮助

可以编写“内联宏”为您生成重命名选项。“内联宏”是指不发出导致执行步骤边界的SAS代码的宏-该宏将执行处理并发出可作为其他SAS语句一部分使用的SAS代码段

考虑一个带有签名的宏

%renameByLabel(data=, byvarname=allow, rename=(label-1=newname-1 label-2=newname-2)).
宏将打开数据集,检查每个变量的名称和标签,并尝试将它们与rename=参数中列出的label=名称对之一相匹配

可以使用这样的宏来处理此代码的必要重命名操作

data have;
  x12345=1;            label x12345="This is x";
  ___y__scrap = "ABC"; label ___y__scrap="This is y";
  ageold = 7;          label ageold="Old age";
run;

data want;
  set have (%renameByLabel(data=have,rename=("This is x"=x "This is y"=y ageold=age)));
run;
宏无权访问当前executor标记化流,因此无法知道当前语句将要处理的数据集。即使内联调用结果是set语句的一部分,宏也要求要处理的数据集使用data=显式声明

示例宏

宏观测试

旁白

要使宏只发出重命名对,需要进行一些小的更改,因此它可以用作数据集rename=选项的一部分,或者用作rename语句的一部分


您可以将宏重写为Proc DS2函数,例如myRenameByLabel,并使用%sysfuncmyRenameByLabel…调用该函数…。有时,在DS2语句中处理不寻常的引用和取消引用情况更容易。

您尝试过以下方法吗

data mydata;
set mydata (rename=(Thisisthelongcolumnnamefromthesourcetable = ShorterName));   
run;

SAS正在SET语句中进行变量命名。因为直到SET语句完成后才尝试重命名函数,所以已经太晚了。如上所示,将重命名为SET语句选项会在SET读入变量之前重命名该变量。

否,但您可以从SASHELP.VCOLUMN获取名称,该列包含元数据,包括标签、变量类型和变量名称。您的原始源数据类型是什么?源是sql表中的varchar50。您可以通过sql传递连接到源,这是适当重命名的最佳选择。它实际上是存储过程的结果,我不确定如何重命名以这种方式出现的列。建议您显示您的PROC DS2代码。在数据步骤中不起作用。有关DS2的有趣评论。您是否有论文或其他例子说明DS2函数在哪些方面使宏开发人员的生活更轻松?我很少玩DS2,但这可能是我的动力。谢谢你的回复!我现在要测试这个!如果你发现它有效,那就太好了!但是,如果要进行大量导入,并且发现标签或变量名称略有不同,则可以修改宏以使用“已知”或“期望”入站映射的数据集,即to_var、from_var、from_label的表。然后,可以从映射表读取宏,而不是指定重命名对,并在遇到新变量或变量变体时添加新行。映射表通常称为“控制表”,感谢Richard提供的详细示例和解释。您是否也有DS2中的示例?为了我自己的教育?你知道在PROC-SQL步骤中是否可以使用它吗?在这一步之后,我遇到了这个问题,因为SAS会自动将两列截断为相同的名称,而数据集中只显示一列。示例:Thisreallylongcolumnname1和Thisreallylongcolumnname2仅作为一列截断为Thisreallylongcol,从而丢失第二列中的数据
* test 1;
%put %renameByLabel (data=sashelp.class, varname=Allow, rename=("Name"=NewName Age=NewAge));

* ===log===;
* NOTE: Generated rename option is rename=(Name=NewName Age=NewAge);

* test 2;
data have;
  x12345=1; label x12345="This is x";
  ___y__scrap = "ABC"; label ___y__scrap="This is y";
  ageold = 7; label ageold="Old age";
run;

data want;
  set have (%renameByLabel(data=have,rename=("This is x"=x "This is y"=y ageold=age)));
run;

* ===log===;
* NOTE: Generated rename option is rename=(x12345=x ___y__scrap=y ageold=age)
data mydata;
set mydata (rename=(Thisisthelongcolumnnamefromthesourcetable = ShorterName));   
run;