当我将SAS数据集导出到csv时;它正在修剪角色中的所有前导空格。 请帮我保留csv输出中的所有前导空格。使用的陈述是:
Proc Export Data = Globl_Mth_Sumry
OutFile = "&GMUPath.\20&RptYr._&RptMt.\03 Output\01 GMU\&Brnd_Abbr.\&Brnd._&Mkt._Globl_Mth_Sumry_&RptMt.&RptYr.&NeuronQTR..csv"
DBMS = CSV Replace;
Run;
因此,有一个列包含国家/地区列表
亚 印度 中国 等等 但是csv文件显示如下: - 亚洲 印度 中国。
请帮忙。
答案 0 :(得分:1)
我发现这是一个有趣的问题,主要是因为我有信心我知道答案......发现我没有。
这在技术上是一个解决方案,如果你处于时间紧缩状态或许已经足够了,尽管我怀疑它在实际使用中太笨重了。首先我生成数据(使用$ CHAR8输入以保留前导空格),然后使用固定列输出而不是列表输出输出它。
data test;
input
@1 x $CHAR8.
@9 y $CHAR8.;
format x y $char8.;
datalines;
USA China
Canada N Korea
Russia Mexico
;;;;
run;
data _null_;
file "c:\temp\test.csv" lrecl=80 dropover;
set test;
if _n_ = 1 then do;
put "x,y";
end;
put @1 x $char8. @9 "," @10 y $char8.;
run;
不幸的是,使用DBMS = CSV似乎不允许$ CHAR8。按照您的预期运作。我不知道为什么会这样。我期望的解决方案是这样写出来:
data _null_;
file 'c:\temp\test.csv' delimiter=',' DROPOVER lrecl=32767;
if _n_ = 1 then /* write column names or labels */
do;
put
"x"
','
"y"
;
end;
set TEST;
put x $ :char8. y $ :char8.;
run;
本质上是PROC EXPORT打印到日志的代码,然后是:$ CHAR8。在每个变量之后。无论出于何种原因,那(以及一堆其他类似的东西)都不起作用。 ODS CSV似乎也不能用于保留前导空格。
答案 1 :(得分:1)
PROC EXPORT
似乎不会做你想要的。但是这里有一个可以解决问题的SAS宏:
%macro mydlm(dsn, outf, dlm, headers);
/*****************************************************************
MYDLM.SAS
SAS Macro to create a delimited file from a SAS data set
Positional Parameters
DSN = SAS Dataset Name
OUTF = Output Text File
DLM = Delimiter to use (CSV, TAB, PIPE, or constant)
HEADERS = Y or N, Include line with variable names at top
Example
%mydlm( sashelp.class , 'c:\temp\tempfile.csv', csv, Y);
****************************************************************/
%if %QUPCASE(&DLM)=CSV %then %let DLM=%str(,);
%else %if %QUPCASE(&DLM)=TAB %then %let DLM='09'x;
%else %if %QUPCASE(&DLM)=PIPE %then %let DLM=%str(|);
proc contents noprint data=&DSN
out=_temp_(keep=name type length varnum label format formatd formatl);
run;
proc sort data=_temp_;
by varnum;
run;
data _null_;
set _temp_ end=eof;
call symput(cats('zvnm',put(_n_,5.)), name);
if format ne ' '
then call symput(cats('zvft',put(_n_,5.))
, cats(format
, put(formatl,best.), '.'
, put(formatd,best.))
);
else if type=2
then call symput(cats('zvft',put(_n_,5.)),cats('$char',put(length,best.),'.'));
else call symput(cats('zvft',put(_n_,5.)),' ');
if eof then call symput('zvcnt',left(put(_n_,8.)));
run;
data _null_;
file &outf;
set &dsn;
%if %upcase(&headers) = Y %then %do;
if _n_ = 1 then put
%do i =1 %to %eval(&zvcnt.-1);
"'%trim(&&zvnm&i)'" "&dlm"
%end;
"'%trim(&&zvnm&zvcnt)'" ;
%end;
put
%do i =1 %to %eval(&zvcnt.-1);
&&zvnm&i &&zvft&i "&dlm"
%end;
&&zvnm&i &&zvft&i;
run;
%mend mydlm;
宏允许您选择CSV,TAB或PIPE(|)作为分隔符。字符变量将保留前导空格,所有变量的宽度将基于任何预定义的SAS变量格式。我用这个样本测试了宏:
data a;
number2 = 2;
format num comma7.;
format date yymmdd10.;
format char $char40.;
date = today();
num = 1; char = ' This has 10 leading blanks'; output;
num = 2; char = 'This has no leading blanks'; output;
run;
%mydlm( a , 'c:\temp\tempfile.csv', csv, y);
更新:为了表示赞赏,上述代码源自我发现on this web page的想法。我本来会指出你的链接,但它并没有真正做你想要的。这也很难读。
UPDATE2 :修改了示例宏以更正语法错误并使其更通用。此新版本允许您将任何字符串指定为列分隔符。我将其添加到支持this other Stack Overflow question,可以使用以下宏调用来回答:
%mydlm( Exp_TXT, '/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt', ~|~, Y);