【问题标题】:Column names missing when exporting files using SAS data step使用 SAS 数据步骤导出文件时缺少列名
【发布时间】:2016-08-02 17:32:10
【问题描述】:

我有一个大型 SAS 数据集 raw_data,其中包含从不同国家收集的数据。该数据集有一列“国家”,其中列出了观测的来源国家。我想在raw_data 中为每个国家/地区导出一个单独的 .csv 文件。我使用以下数据步骤来生成输出:

data _null_;
  set raw_data;
  length fv $ 200;
  fv = "/directory/" || strip(put(country,$32.)) || ".csv";
  file write filevar=fv dsd dlm=',';
  put (_all_) (:);
run;

但是,生成的 .csv 文件不再具有来自 raw_data 的列名。我的数据集中有一百多列,因此列出所有列名是令人望而却步的。谁能给我一些关于如何修改上述代码以便将列名附加到正在导出的 .csv 文件的指导?任何帮助表示赞赏!

【问题讨论】:

    标签: csv sas


    【解决方案1】:

    您可以创建一个宏变量来保存变量名称并将它们放入 CSV 文件中。

    proc sql noprint;
    select name into :var_list separated by ", "
    from sashelp.vcolumn
    where libname="WORK" and memname='RAW_DATA'
    order by varnum;
    quit;
    
    data _null_;
    set raw_data;
    length fv $ 200;
    by country;
    fv = "/directory/" || strip(put(country,$32.)) || ".csv";
    
    if first.country then do;
        put "&var_list";
    end;
    
    file write filevar=fv dsd dlm=',';
    put (_all_) (:);
    run;
    

    【讨论】:

    • 感谢 Reeza 的回复!在您提供的 proc sql 语句中,是否需要在 select 子句中手动列出名称?我有几百列,所以我想尽可能地自动化。
    • 不...这就是 SQL 语句的作用,它会创建名称列表。
    • 嗯...当我运行它时,我收到以下错误:“错误:在贡献表中找不到以下列:名称。”
    • 在上面修复了它,引用了错误的表 - 应该是 vcolumn。这是一个包含有关您的表的所有元数据的表,即填充 proc 内容的信息。
    【解决方案2】:

    考虑这个与您的程序非常相似的数据步骤。它使用VNEXT查询PDV并将变量名写入每个文件的第一条记录。

    proc sort data=sashelp.class out=class;
       by age;
       run;
    data _null_;
       set class;
       by age;
       filevar=catx('\','C:\Users\name\Documents',catx('.',age,'csv'));
       file dummy filevar=filevar ls=256 dsd;
       if first.age then link names;
       put (_all_)(:);
       return;
    names:
       length _name_ $32;
       call missing(_name_);
       do while(1);
          call vnext(_name_);
         if _name_ eq: 'FIRST.' then leave;
          put _name_ @;
         end;
       put; 
       run; 
    

    【讨论】:

    • 测试“FIRST”。 (包括期间)。还将 FILEVAR= 和 FILE 语句移动到 NAMES 块中。否则 PUT ALL 也会写入 FILEVAR 的值。
    • 首先同意。但是你需要在制作你不知道答案的 cmets 之前测试程序。
    • 测试是问题所在,但在测试中我注释掉了 FILE 语句,以便我可以看到 LOG 中的值。这使得变量出现在 _ALL_ 列表中。
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    相关资源
    最近更新 更多