我輩はブロガーではない。ネタもまだない

SASとかDelphiあたりの人様の役に立たないネタを提供します

値をダブルクォーテーションで囲んで、外部ファイル(CSV)として出力する方法

昨日に引き続き、csvのお話。あっちはExcel、こっちはSAS

SAScsvファイルを処理するのに、"をつけたい(クォート処理したい)な、と思って検索していたら、
SASに以下のFAQが登録されていました。
値をダブルクォーテーションで囲んで、外部ファイルとして出力する方法

ここに記載されているプログラムを手元で実行したところ、意図しないデータになったので検証しました。
(もう手元にSAS9.4しかないので異なるバージョンでの比較ができないのですが。)

/* テストデータ */
data test;
  a='abc';
  b='123';
run;

data _null_;
  set test;
  file 'c:\temp\test1.dat' dlm=',';
  put a b;
run;
data _null_;
  set test;
  file 'c:\temp\test2.dat' dlm=',';
  format _all_ $QUOTE.;
  put a b;
run;
data _null_;
  set test;
  file 'c:\temp\test3.dat' dsd;
  put a b;
run;
data _null_;
  set test;
  file 'c:\temp\test4.dat' dsd;
  format _all_ $QUOTE.;
  put a b;
run;

結果はこんな感じです。

つまり、クオーテーションで括ったcsvファイルを作成したいなら、
dsdオプションは使用せず、dlm=','と$QUOTE.出力形式を使用しましょう、ということになります。

f:id:japelin:20191211160837p:plain

f:id:japelin:20191211160905p:plain

f:id:japelin:20191211160912p:plain

f:id:japelin:20191211160920p:plain


ちなみに、odsを使うと、変数名も出て、クォーテーションで括ってくれます。

ods csv file='c:\temp\test5.dat';
ods csvall file='c:\temp\test6.dat';
proc print data=test;
run;
ods csv close;
ods csvall close;

ods csvall file='c:\temp\test7.dat';
title;
proc print data=test;
run;
ods csvall close;

結果は以下の通り。
(NOOBSオプション指定するの忘れたのでOBS番号が出ちゃってますが)
f:id:japelin:20191211164024p:plain

f:id:japelin:20191211164329p:plain

f:id:japelin:20191211164038p:plain



とはいえ、クォートしてくれるのは文字変数だけなので、変数名が必要なければ、
dataステップで

format _character_ $QUOTE.;

としてputした方が使いやすいかもしれないですね。

変数名や変数ラベルが必要ならodsで。
(変数ラベルはPROC PRINTでLABELオプションを指定すれば出力される)



なお、odsなら、フォーマットがかかった数値変数もクォートしてくれます。

data test;
  a='abc';
  b=123;
  format b yymmdd10.;
run;

data _null_;
  set test;
  file 'c:\temp\test8.dat' dlm=',';
  put a b;
run;
ods csv file='c:\temp\test9.dat';
proc print data=test noobs;
run;
ods csv close;

結果はこう。
f:id:japelin:20191211165103p:plain

f:id:japelin:20191211165131p:plain