使用libname引擎将包装的头文件导入SAS

时间:2017-11-03 12:11:45

标签: sas

我尝试将带有包装标头的xlsx文件导入SAS。每个标题包含2行,例如:

ATT1

我使用的是SAS xl libname引擎,但我只是选择了' Att1'并且我在导入之前无法对文件进行任何更改。

有没有人知道这方面的任何选项或解决方案?

非常感谢, Cammie

2 个答案:

答案 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的变量。