我尝试将带有包装标头的xlsx文件导入SAS。每个标题包含2行,例如:
ATT1
店
我使用的是SAS xl libname引擎,但我只是选择了' Att1'并且我在导入之前无法对文件进行任何更改。
有没有人知道这方面的任何选项或解决方案?
非常感谢, Cammie
答案 0 :(得分:0)
我使用excel的“包裹”线进行了测试。
这意味着一个单元格中的2行用CRLF(携带返回)字符分隔。
%let path=H:\desktop\XLSX\wrapped.xlsx;
PROC IMPORT
datafile="&Path"
out=WORK.wrapped
DBMS=XLSX REPLACE;
RANGE="Sheet1$A1:0";
GETNAMES=YES;
RUN;
标题中只有一行(因为总长度不符合32个字符)。 在LABEL中,您可以看到2行。
proc sql;
select memname,
name,
label
from dictionary.columns
where libname = 'WORK'
and memname = 'WRAPPED';
quit;
所以我想应该可以使用标签重命名列名并尝试删除CRLF字符。
proc sql;
select label into: label separated by '|'
from dictionary.columns
where libname = 'WORK'
and memname = 'WRAPPED';
quit;
%put label=&label;
但是如果列的名称大于32个字符,则无法使用这两行重命名列。
我建议您检查标题的长度,引擎(XLSX)。
因为我使用“wrapped”标题进行了第二次测试,长度小于32个字符,并且输出数据集中的标题已正确导入。
答案 1 :(得分:0)
与我在评论中所说的相似,这里有几种可能的解决方法。
如果标题的长度不超过32个字符,则可以在导入或执行分配库之前设置options validvarname=V7;
。这会将除字母数字字符和unerscores之外的任何字符转换为下划线。生成的标题应该看起来像Att1__Store
。
但是,如果您的标头 超过32个字符。你可以解决它如下。在此示例中,我创建了一个XLSX工作簿,单元格A1中的值Att1 Store
只有Store
之前的新行。
首先,您可以通过在GETNAMES
中将NO
选项设置为proc import
来导入文件而不从XLSX文件的第一条记录中获取列名。
proc import datafile="<path_to_file>\book1.xlsx" dbms=xlsx out=table replace;
sheet='Sheet1';
getnames=no;
run;
结果数据集将在第一次观察中包含您的Excel头。您的数据集变量将命名为A,B,C等...在我的例子中,table
数据集有一个名为A
的变量和一个带有标题名称的观察,包括空格和新行字符。
然后,在清除了#34;无效&#34;之后,您将把标题分配给宏变量。 SAS变量名字符:
data _null_;
set table;
if _n_=1 then call symput('A',compress(A,,'S'));
stop;
run;
最后,您将通过将每个变量重命名为存储在宏变量中的Excel有效版本的Excel标题来重新创建数据集,并开始从第二行读取观察结果。
data table;
set table(rename=(A=&A.) firstobs=2);
run;
结果数据集有一个名为Att1Store
的变量。