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

いつも大変お世話になっております。
PC-SAS日本語版の中で、sjisのSASデータセットをUTF-8に変換したxptファイルを作りたいと考えております。

/* (1)classデータを一旦外部に保存 */
libname out "./hoge";
proc copy in=sashelp out=out;
  select class/memtype=data;
run;
/* (2)sjisをutf-8に変換 */
libname inlib cvp "./hoge";
libname outlib "./hoge/hoge" outencoding="UTF-8";
proc copy noclone in=inlib out=outlib;
  select class/memtype=data;
run;
/* (3)xpt化する */
libname xpt xport "./hoge/hoge/class.xpt";
proc copy in=outlib out=xpt;
  select class/memtype=data;
run;

(2)の工程で、sas7bdatならばUTF-8にエンコーディングされているのですが、
(3)のxpt化工程で、xptファイルは元のsjisに戻ってしまうようなのです(*)。
(3)の工程でUTF-8化できないものでしょうか。
以上ご教示のほど、何卒よろしくお願いいたします。

 

(*)このxptファイルをSAS UEやSAS ODAに読み込ませても日本語が文字化けしています。

1 ACCEPTED SOLUTION

Accepted Solutions
japelin
Rhodochrosite | Level 12

推測ではありますが、xportエンジンはoutencodeingに対応していない(ログにでます)ので、

xportエンジンで指定されたライブラリにPROC COPYで作成されるものは、デフォルト

エンコーディング(SJIS)になってしまうのではないかという気がします。

 

回避手段としては力技でuniccode版のSASセッションを呼び出す、という方法くらいしか思いつきませんね…

 

 

/* 実行プログラムとログ */
filename toxptsas "toxpt.sas" encoding='utf-8';
filename toxptlog "toxpt.log" encoding='utf-8';

/* 実行プログラム生成 */
data _null_;
  file toxptsas;
put 'libname outlib "./hoge/hoge"';
put 'libname xpt xport "./hoge/hoge/class.xpt";';
put 'proc copy in=outlib out=xpt;';
put '  select class/memtype=data;';
put 'run;';
run;
/* 実行用パスの生成 */ data _null_; sasexe="%sysget(sasroot)\sas.exe"; sascfg=tranwrd(getoption('config'),'\ja\','\u8\'); sasprg="%sysfunc(pathname(toxptsas))"; saslog="%sysfunc(pathname(toxptlog))"; call symputx('cmd',''' "'||sasexe||'" -CONFIG "'||strip(sascfg)||'" -sysin "'||sasprg||'" -log "'||saslog||'"'''); rc=filename('cfg',sascfg); rc=fexist('cfg'); if rc=1 then call symputx('u8flg',1); else call symputx('u8flg',0); rc=filename('cfg'); run; /* Unicode版SASのCFGがある場合のみ実行 */ %if &u8flg=1 %then %do; data _null_; rc=system(&cmd); run; /* 実行ログを表示 */ data _null_; infile toxptlog; input; put _infile_; run; %end; filename toxptsas; filename toxptlog;

 

(XPTをインポート等細かいチェックはしていませんが、バイナリレベルではUNICODE版SASと同じXPTファイルが作成できています)

View solution in original post

3 REPLIES 3
japelin
Rhodochrosite | Level 12

推測ではありますが、xportエンジンはoutencodeingに対応していない(ログにでます)ので、

xportエンジンで指定されたライブラリにPROC COPYで作成されるものは、デフォルト

エンコーディング(SJIS)になってしまうのではないかという気がします。

 

回避手段としては力技でuniccode版のSASセッションを呼び出す、という方法くらいしか思いつきませんね…

 

 

/* 実行プログラムとログ */
filename toxptsas "toxpt.sas" encoding='utf-8';
filename toxptlog "toxpt.log" encoding='utf-8';

/* 実行プログラム生成 */
data _null_;
  file toxptsas;
put 'libname outlib "./hoge/hoge"';
put 'libname xpt xport "./hoge/hoge/class.xpt";';
put 'proc copy in=outlib out=xpt;';
put '  select class/memtype=data;';
put 'run;';
run;
/* 実行用パスの生成 */ data _null_; sasexe="%sysget(sasroot)\sas.exe"; sascfg=tranwrd(getoption('config'),'\ja\','\u8\'); sasprg="%sysfunc(pathname(toxptsas))"; saslog="%sysfunc(pathname(toxptlog))"; call symputx('cmd',''' "'||sasexe||'" -CONFIG "'||strip(sascfg)||'" -sysin "'||sasprg||'" -log "'||saslog||'"'''); rc=filename('cfg',sascfg); rc=fexist('cfg'); if rc=1 then call symputx('u8flg',1); else call symputx('u8flg',0); rc=filename('cfg'); run; /* Unicode版SASのCFGがある場合のみ実行 */ %if &u8flg=1 %then %do; data _null_; rc=system(&cmd); run; /* 実行ログを表示 */ data _null_; infile toxptlog; input; put _infile_; run; %end; filename toxptsas; filename toxptlog;

 

(XPTをインポート等細かいチェックはしていませんが、バイナリレベルではUNICODE版SASと同じXPTファイルが作成できています)

sasone
Quartz | Level 8

kawakamiさま

 

早速のご回答、誠にありがとうございました。
PC-SAS日本語版ではUTF-8のxptファイルを作れないことを理解いたしました。

sasone
Quartz | Level 8

sas.exeのプロパティのショートカット→リンク先の「ja」を「u8」に書き換れば、unicode版のSASを呼び出すことができ、xpt化する最終工程のみこのunicode版SASを用いることで、UTF-8のxptファイルを作ることができました。
ありがとうございました。

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
  • 3 replies
  • 1681 views
  • 3 likes
  • 2 in conversation