値をダブルクォーテーションで囲んで、外部ファイル(CSV)として出力する方法
昨日に引き続き、csvのお話。あっちはExcel、こっちはSAS
SASでcsvファイルを処理するのに、"をつけたい(クォート処理したい)な、と思って検索していたら、
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.出力形式を使用しましょう、ということになります。
ちなみに、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番号が出ちゃってますが)
とはいえ、クォートしてくれるのは文字変数だけなので、変数名が必要なければ、
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;
結果はこう。