いつも大変お世話になっております。
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に読み込ませても日本語が文字化けしています。
推測ではありますが、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ファイルが作成できています)
推測ではありますが、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ファイルが作成できています)
kawakamiさま
早速のご回答、誠にありがとうございました。
PC-SAS日本語版ではUTF-8のxptファイルを作れないことを理解いたしました。
sas.exeのプロパティのショートカット→リンク先の「ja」を「u8」に書き換れば、unicode版のSASを呼び出すことができ、xpt化する最終工程のみこのunicode版SASを用いることで、UTF-8のxptファイルを作ることができました。
ありがとうございました。
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.