いつも大変お世話になっております。
Shift-JIS環境で作られてしまった日本語を含むxptファイルを、unicode版のSASで読み込むにはどのようにしたらよろしいでしょうか。
COPYプロシジャを使って読み込んでも日本語が文字化けしてしまいます。
libname xpt xport "./hoge/class.xpt";
proc copy in=xpt out=work;
select class/memtype=data;
run;
将来的にサーバー系のunicode版SASに移行するとしたとき、PC-SASで作った過去の資源は使えなくなってしまうのでしょうか(sas7bdatでも保存をかけておくべきなのでしょうか)。
もう少し詳しく説明してみます。
①XPTファイルにはエンコーディング情報は含まれていないため、復元した環境のセッションエンコーディングであると見なされる。そのため元のエンコーディングと異なる環境で復元すると文字化けが発生してしまう。対応として復元後にデータセットのヘッダ情報のエンコーディング情報を適切な値に修正する。
②ヘッダ情報を修正しSASが適切にエンコーディングを把握できているため自動変換(CEDA)により文字化けは修正されるが、Shift-JISでエンコードされた日本語文字はUTF-8に変換するとバイト数が増加するため文字切れが発生しており、変数長を拡張する必要がある。
今①への対応がDATASETSプロシジャで完了していますので、そのデータセットに対しCVPエンジンを使って読み込み、COPYプロシジャで変換を行う必要があることになります(②への対応)。
libname xpt xport "./class.xpt";
libname out1 "C:\temp\sjis";
proc copy in=xpt out=out1;
select class/memtype=data;
run;
proc datasets lib=out1 noprint;
modify class / correctencoding=sjis;
quit;
/* CVPエンジンで定義しなおす。このライブラリで参照したデータセットは
自動で変数長が拡張される。読み取り専用 */
libname in cvp "C:\temp\sjis";
libname out2 "C:\temp\utf8";
proc copy in=in out=out2 noclone;
run;
DATASETSプロシジャのCORRECTENCODINGオプションでSJISに変更し、その後は一般的なSJIS→UTF-8のデータセットの変換手順で読み込み可能かと思います(CVPエンジン等)。
proc datasets noprint;
modify class / correctencoding=sjis;
quit;
yu_sasさま
早速のご回答、誠に有難うございます。
xptファイルを読み込んでDATASETSプロシジャでSJISにcorrectencodingすると、日本語の変数が文字切れしてしまうのですが、回避する方法はございますでしょうか。
sashelp.classをSJIS環境でxpt化してから、unicode版SASで読み込んでいるだけなのですが、名前の変数データの一部がWARNINGとともに損失してしまいます。
一般的な日本語文字はSJISからUTF-8に変換されると2バイトから3バイトになっています(一部文字は4バイト)。半角カタカナは1バイトから3バイトになります。そのため変数長を調整する必要があります。これにはCVPエンジンが利用できます。デフォルトでは1.5倍になります。
libname in cvp "xxx";
libname out "yyy";
proc copy in=in out=out noclone;
run;
CVPBYTES=オプション、CVPENGINE=オプション、CVPMULTIPLIER=オプション
先ずPC-SAS日本語版を使用してxptファイルを外部に保存したとします。
/*(1)PC-SAS日本語版(sjis)からxptファイルを吐く*/
libname xpt xport "./class.xpt";
proc copy in=sashelp out=xpt;
select class/memtype=data;
run;
次にPC-SAS unicode版を立ち上げて、先ほどのxptファイルを読み込むとします。
/*(2)PC-SAS unicode版(utf-8)でxptを読み込む*/
libname xpt xport "./class.xpt";
proc copy in=xpt out=work;*文字化けしている;
select class/memtype=data;
run;
/*(3)PC-SAS unicode版(utf-8)でwork内のデータセットの文字化けを治す*/
proc datasets noprint;
modify class / correctencoding=sjis;
quit;*文字化けは解消されたが文字切れが生じる;
上記(2)(3)のプログラムのどこを修正したら、データセットの文字切れが解消しますでしょうか
(CVPエンジンを使うタイミングはどこになりますでしょうか)。
以上ご教示のほど何卒お願い申し上げます。
もう少し詳しく説明してみます。
①XPTファイルにはエンコーディング情報は含まれていないため、復元した環境のセッションエンコーディングであると見なされる。そのため元のエンコーディングと異なる環境で復元すると文字化けが発生してしまう。対応として復元後にデータセットのヘッダ情報のエンコーディング情報を適切な値に修正する。
②ヘッダ情報を修正しSASが適切にエンコーディングを把握できているため自動変換(CEDA)により文字化けは修正されるが、Shift-JISでエンコードされた日本語文字はUTF-8に変換するとバイト数が増加するため文字切れが発生しており、変数長を拡張する必要がある。
今①への対応がDATASETSプロシジャで完了していますので、そのデータセットに対しCVPエンジンを使って読み込み、COPYプロシジャで変換を行う必要があることになります(②への対応)。
libname xpt xport "./class.xpt";
libname out1 "C:\temp\sjis";
proc copy in=xpt out=out1;
select class/memtype=data;
run;
proc datasets lib=out1 noprint;
modify class / correctencoding=sjis;
quit;
/* CVPエンジンで定義しなおす。このライブラリで参照したデータセットは
自動で変数長が拡張される。読み取り専用 */
libname in cvp "C:\temp\sjis";
libname out2 "C:\temp\utf8";
proc copy in=in out=out2 noclone;
run;
yu_sasさま
ご丁寧にもありがとうございます。
ご教示頂いた方法で文字化け、文字切れともに解消できました!
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.
Lock in the best rate now before the price increases on April 1.