【问题标题】:SAS proc export to CSV: how to add double quotesSAS proc 导出到 CSV:如何添加双引号
【发布时间】:2014-08-29 16:04:39
【问题描述】:

对此很陌生,所以很抱歉。我在 SAS 中有一个文件,我需要将其导出为 CSV,并且我需要在所有字段中添加双引号。我怎样才能做到这一点?提前致谢。

【问题讨论】:

  • 由于缺乏任何研究工作的证据,我有点犹豫要不要回答这个问题,但答案并不明显,可能对其他人有用,所以我还是回答了。
  • 如果您能在 CSV 文件中说明需要所有这些额外引号的目标系统,这对其他用户也会有所帮助。

标签: csv sas


【解决方案1】:

有多种方法可以从 SAS 创建 CSV 文件。使用proc export 不会将每个字段都用双引号括起来,所以最简单的方法是%ds2csv() 宏。这假设您拥有 SAS 9.2 或更高版本。它的文档可以在这里找到:

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002683390.htm

运行示例:

%ds2csv(data=sashelp.retail, runmode=b, csvfile=c:\class.csv);

生产:

"Retail sales in millions of $","DATE","YEAR","MONTH","DAY"
"$220","80Q1","1980","1","1"
"$257","80Q2","1980","4","1"
"$258","80Q3","1980","7","1"

【讨论】:

  • 文档实际上并没有说这个宏会引用每个字段。如果 SAS 发布代码,我会觉得使用它会更好。宏的源代码可用,但它调用 SCL 程序 (sashelp.webutil.ds2csv.scl) 来完成实际工作,无法查看 SCL 代码。
  • 但必须只引用 TEXT 字段,而不是全部。投票“-”
  • @crow16384 阅读问题......然后我引用:“我需要在所有字段中添加双引号”。强调 ALL 是我自己的。
  • 对不起!是我的错!可能的话会投票!
【解决方案2】:

这是另一个使用数据步骤的方法

data _null_;
    file 'data_want.csv' dsd dlm = ',';
    set data_have;
    if _n_ = 1 then put @1 "variables name to input"; /* Add variable names */
    put (_all_) (~);
run;

【讨论】:

【解决方案3】:

这是一种在包含标题的情况下获得相同结果的方法

proc contents data=sashelp.class out=vars(keep=name varnum);run;

proc sql noprint;
    select quote(strip(name)) into :vars separated by '|' from vars
    order by varnum;
quit;

data _null_;
    file 'test.txt' dsd dlm='|';
    set sashelp.class;
    if _n_ = 1 then put %sysfunc(quote(&vars.));
    put (_all_) (~);
run;

【讨论】:

  • 我认为用户可能也想要引号中的标题。所以使用select quote(trim(name)) into ...并将put语句调整为put %sysfunc(quote(&vars))
【解决方案4】:

我知道这是个老问题,但我的 2 便士...

下面的宏不引用格式化为字符值的数值,但它很容易实现。

%macro csvQuoteChars(lib=,dset=,outPath=);

 proc contents data=&lib..&dset out=c(keep=name type) noprint;
 run;

 %let dsid = %sysfunc(open(c));
 %let nobs = %sysfunc(attrn(&dsid,nlobs));

 data _null_;
  set &lib..&dset;
  file "&outPath\&lib..&dset..csv" dsd;

  %do i=1 %to &nobs;
      %let rc = %sysfunc(fetchobs(&dsid,&i));
      %let vName = %sysfunc(getvarc(&dsid,1));
      %let vType = %sysfunc(getvarn(&dsid,2));
      %put &=vName &=vType;

      %if &vType = 2 %then %do;
          put (&vName) (~) @;
      %end;
      %else %if &vType = 1 %then %do;
          put &vName @;
      %end;

      %if &i = &nobs %then %do;
          put;
      %end;

  %end;

 run;

 %let dsid = %sysfunc(close(&dsid));

%mend csvQuoteChars;
%csvQuoteChars(lib=sashelp,dset=class,outPath=d:\temp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2019-04-12
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多