该代码中有许多逻辑和语法错误。
主要的逻辑错误是在 SAS 已经确定字符变量的长度后,您无法更改它的长度。在您的代码中,它是在编译 SET 语句时确定的。
另一个逻辑错误是在数据步骤中使用宏 %DO 循环。为什么?
您的示例 LENGTH 语句在语法上是错误的。 LENGTH 语句中不能有数组引用。只是实际的变量名称。您可以在 ARRAY 语句中设置长度,如果它是定义变量的第一个位置。但是您不能使用_character_ 变量列表,因为变量列表要查找变量,必须已经定义变量。这意味着改变为时已晚。
您可能需要恢复到少量代码生成。
让我们使用 PROC IMPORT 创建一个示例数据集。我们可以为此使用 SASHELP.CLASS 示例数据。
filename csv temp;
proc export data=sashelp.class outfile=csv dbms=csv ;run;
proc import datafile=csv out=sample replace dbms=csv ;run;
结果变量列表:
这也是一个有用的案例,因为它将演示一个关于更改字符变量长度的问题。如果您已将 FORMAT 分配给变量,则最终变量长度可能与格式宽度不匹配。
这是一种动态生成代码以更改字符变量长度的方法而不更改它们在数据集中的相对位置。基本上这将读取表的元数据并使用它为每个变量生成一系列名称/类型+长度对。
proc sql noprint ;
select varnum
, catx(' ',name,case when type='num' then put(length,1.) else '$30' end)
into :varlist
, :varlist separated by ' '
from dictionary.columns
where libname='WORK' and memname='SAMPLE'
order by 1
;
quit;
然后您可以在LENGTH 语句中使用生成的列表来定义变量的类型和长度。您还可以添加 FORMAT 和 INFORMAT 语句以删除 $xx. 格式和 PROC IMPORT(错误地)添加到字符变量中的信息。
data want ;
length &varlist ;
set sample;
format _character_ ;
informat _character_;
run;