【问题标题】:Importing wrapped headers into SAS using the libname engine使用 libname 引擎将包装的标头导入 SAS
【发布时间】:2017-11-03 12:11:44
【问题描述】:

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

Att1
商店

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

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

非常感谢, 卡米

【问题讨论】:

  • "wrapped"是什么意思?你的意思是标题跨越多行?还是 Att1 和 Store 在同一个单元格中由“换行”字符分隔? 实际包装的单元格或只是 excel 中的视觉功能,不会影响导入。
  • 我的意思是第二个 - Att1 和 Store 在同一个单元格中,并由“换行”字符分隔。非常感谢。
  • 我使用libname 语句和import 过程对此进行了测试,并且标题按原样导入,包括单词“换行”字符.我们需要有关您的流程的更多信息,以便了解您最终出了什么问题。正如汤姆建议的那样,您可能需要检查两个单词之间是否还有一堆空格,从而使整个标题超过 32 个字符。

标签: sas


【解决方案1】:

我用 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)。

因为我使用“包装”标题进行了第二次测试,长度小于 32 个字符,并且输出数据集中的标题已正确导入。

【讨论】:

    【解决方案2】:

    与我在评论中所说的一样,这里有几个可能的解决方法。

    如果您的标题长度不超过 32 个字符,您可以在导入或执行分配库之前设置 options validvarname=V7;。这会将除字母数字字符和单下划线以外的任何字符转换为下划线。您生成的标题应该看起来像Att1__Store

    但是,如果您的标题 超过 32 个字符。您可以按如下方式解决它。在此示例中,我创建了一个 XLSX 工作簿,在单元格 A1 中只有值 Att1 Store,在 Store 之前有一个新行。

    首先,通过将proc import 中的GETNAMES 选项设置为NO,您将导入文件而不从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 的变量和一个带有标题名称的观察值,包括空格和换行符。

    然后,您将在清除“无效”SAS 变量名称字符后将标头分配给宏变量:

    data _null_;
    set table;
    if _n_=1 then call symput('A',compress(A,,'S'));
    stop;
    run;
    

    最后,您将通过将每个变量重命名为存储在宏变量中的 SAS 有效版本的 Excel 标题重新创建数据集,并开始从第二行读取观察结果。

    data table;
    set table(rename=(A=&A.) firstobs=2);
    run;
    

    生成的数据集有一个名为 Att1Store 的变量。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2022-10-14
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 2010-11-25
      相关资源
      最近更新 更多