3

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 ファイルは次のように表示されています。

助けてください。

4

2 に答える 2

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 は、先頭のスペースを保持するためにも機能しないようです。

于 2013-01-25T16:55:42.470 に答える
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、またはパイプ (|) を選択できます。文字変数では先頭の空白が保持され、すべての変数の幅は定義済みの 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);

更新:信用を与えるために、上記のコードは、この Web ページで見つけたアイデアから派生したものです。そのリンクを指摘しただけですが、実際にはあなたが望んでいることはしませんでした。読むのも本当に大変です。

UPDATE2 : サンプル マクロを修正して、構文エラーを修正し、より一般的なものにしました。この新しいバージョンでは、列区切り文字として任意の文字列を指定できます。この他の Stack Overflow questionをサポートするためにこれを追加しています。これは、次のマクロ呼び出しを使用して回答できます。

%mydlm( Exp_TXT, '/fbrms01/dev/projects/tadis003/Export_txt_OF_New.txt', ~|~, Y);
于 2013-01-25T20:59:55.877 に答える