BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Masayuk1
Fluorite | Level 6

文字列と数値の両方の項目を含むデータを、

  • ダブルクォーテーション括り(文字列、数値の両項目ともに括る)
  • UTF-8 (BOMなし)

で出力したいです。

今現在は%ds2csv を使いダブルクォーテーション括りで出力したファイルを、外部コマンドを実行しUTF8(BOMなし)に変換することで実現していますが、より効率的な方法があればご教授いただけないでしょうか。

 

1 ACCEPTED SOLUTION

Accepted Solutions
japelin
Rhodochrosite | Level 12

数値変数をクオート付きで出力するのは面倒なので、そのままds2csvを使いつつ、

出力されたファイルをutf-8nに変換してはいかがでしょうか。

 

%let csvfile1=%sysfunc(pathname(work))\_tmp_.csv;/* テンポラリ出力 */
%let csvfile2=c:\temp\test.csv;
%ds2csv (data=work.test, runmode=b, csvfile=&csvfile1);/* テンポラリに出力 */
filename incsv "&csvfile1";
filename outcsv "&csvfile2" encoding='utf-8' nobom;
data _null_;
  infile incsv;
  file outcsv;
  input;
  put _infile_;
run;

効率のいい方法、というのが具体的にどのようなことを期待しているのかがわかれば、別の方法が提案されるかもしれません。

(例えば、外部コマンドでやっていることをなくしたい、sasだけで処理を完結させたい、等)

View solution in original post

4 REPLIES 4
japelin
Rhodochrosite | Level 12

数値変数をクオート付きで出力するのは面倒なので、そのままds2csvを使いつつ、

出力されたファイルをutf-8nに変換してはいかがでしょうか。

 

%let csvfile1=%sysfunc(pathname(work))\_tmp_.csv;/* テンポラリ出力 */
%let csvfile2=c:\temp\test.csv;
%ds2csv (data=work.test, runmode=b, csvfile=&csvfile1);/* テンポラリに出力 */
filename incsv "&csvfile1";
filename outcsv "&csvfile2" encoding='utf-8' nobom;
data _null_;
  infile incsv;
  file outcsv;
  input;
  put _infile_;
run;

効率のいい方法、というのが具体的にどのようなことを期待しているのかがわかれば、別の方法が提案されるかもしれません。

(例えば、外部コマンドでやっていることをなくしたい、sasだけで処理を完結させたい、等)

yu_sas
SAS Employee

こんにちは。コミュニティの活用、ありがとうございます。

 

引数においてCSVFILEの代わりにCSVFREFを指定すると、直接FILENAMEステートメントで

定義した名前を利用することができます。

 

filename a "C:\temp\test_utf.csv" encoding="utf-8" nobom;
%ds2csv(data=sashelp.class, runmode=b, csvfref=a);
Masayuk1
Fluorite | Level 6
ご回答いただきありがとうございます。
おかげさまで、ご教授頂いた方法で実現できました。
Masayuk1
Fluorite | Level 6
ご回答いただきありがとうございます。
おかげさまで、ご教授頂いた方法で実現できました。
言葉足らずで申し訳ありません。ご想像通り、外部コマンドをやめてSASだけで処理を完結させる方法を探しておりました。

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 4 replies
  • 5903 views
  • 7 likes
  • 3 in conversation