理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードはEUCのテキストファイルをわざとUTF-8で読み取ってデータセット化し、SJISのエンコーディングで保存しています。
- data data1(encoding='utf-8');
- length name $16;
- input name;
- cards;
- 与太郎
- 助六
- 正蔵
- 円楽
- 八雲
- ;;
- run;
- data _null_;
- set data1;
- file 'c:\temp\euc.txt' encoding='jeuc';
- put name;
- run;
- data data2(encoding='utf-8');
- infile 'c:\temp\euc.txt' encoding='jeuc';
- length name $16;
- input name;
- run;
- data data3(encoding='utf-8');
- infile 'c:\temp\euc.txt' encoding='utf-8';
- length name $16;
- input name;
- run;
- data data4(encoding='sjis');
- set data3(encoding='utf-8');
- run;
- 362 data data1(encoding='utf-8');
- 363 length name $16;
- 364 input name;
- 365 cards;
- NOTE: データセットWORK.DATA1は5オブザベーション、1変数です。
- NOTE: DATAステートメント処理(合計処理時間):
- 処理時間 0.03 秒
- CPU時間 0.01 秒
- 371 ;;
- 372 run;
- 373
- 374 data _null_;
- 375 set data1;
- 376 file 'c:\temp\euc.txt' encoding='jeuc';
- 377 put name;
- 378 run;
- NOTE: 出力ファイル'c:\temp\euc.txt' :
- ファイル名=c:\temp\euc.txt,
- レコードフォーマット=V,
- 論理レコード長=65534,
- ファイルサイズ (バイト)=0,
- 更新日時=2016年08月07日 13時28分31秒,
- 作成日時=2016年08月07日 13時06分49秒
- NOTE: 5レコードを出力ファイル'c:\temp\euc.txt'に書き込みました。
- 最小レコード長は6です。
- 最大レコード長は9です。
- NOTE: データセットWORK.DATA1から5オブザベーションを読み込みました。
- NOTE: DATAステートメント処理(合計処理時間):
- 処理時間 0.01 秒
- CPU時間 0.01 秒
- 379
- 380 data data2(encoding='utf-8');
- 381 infile 'c:\temp\euc.txt' encoding='jeuc';
- 382 length name $16;
- 383 input name;
- 384 run;
- NOTE: 入力ファイル'c:\temp\euc.txt' :
- ファイル名=c:\temp\euc.txt,
- レコードフォーマット=V,
- 論理レコード長=65534,
- ファイルサイズ (バイト)=32,
- 更新日時=2016年08月07日 13時28分31秒,
- 作成日時=2016年08月07日 13時06分49秒
- NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。
- 最小レコード長は6です。
- 最大レコード長は9です。
- NOTE: データセットWORK.DATA2は5オブザベーション、1変数です。
- NOTE: DATAステートメント処理(合計処理時間):
- 処理時間 0.01 秒
- CPU時間 0.01 秒
- 385
- 386 data data3(encoding='utf-8');
- 387 infile 'c:\temp\euc.txt' encoding='utf-8';
- 388 length name $16;
- 389 input name;
- 390 run;
- NOTE: 入力ファイル'c:\temp\euc.txt' :
- ファイル名=c:\temp\euc.txt,
- レコードフォーマット=V,
- 論理レコード長=131068,
- ファイルサイズ (バイト)=32,
- 更新日時=2016年08月07日 13時28分31秒,
- 作成日時=2016年08月07日 13時06分49秒
- NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。
- 最小レコード長は4です。
- 最大レコード長は6です。
- NOTE: データセットWORK.DATA3は5オブザベーション、1変数です。
- NOTE: DATAステートメント処理(合計処理時間):
- 処理時間 0.03 秒
- CPU時間 0.01 秒
- 391
- 392 data data4(encoding='sjis');
- 393 set data3(encoding='utf-8');
- 394 run;
- NOTE: データファイルWORK.DATA4.DATAは別なホストにネイティブな形式が使用
- されているか、またはエンコーディングがセッションエンコーディ
- ングと一致していません。クロス環境データアクセスが使用される
- ため、追加のCPUリソースが必要となり、パフォーマンスが低下しま
- す。
- ERROR: データセットWORK.DATA4のトランスコード時に文字データが一部損失
- しました。新しいエンコーディングで表せない文字がデータに含ま
- れていたか、またはトランスコード時に切り捨てが発生しました。
- NOTE: DATAステップは異常終了しました。
- NOTE: エラーが発生したため、このステップの処理を中止しました。
- NOTE: データセットWORK.DATA3から3オブザベーションを読み込みました。
- WARNING: データセットWORK.DATA4は未完成です。このステップは、
- 2オブザベーション、1変数で停止しました。
- WARNING: このステップを中止したため、データセットWORK.DATA4を置き換えて
- いません。
- NOTE: DATAステートメント処理(合計処理時間):
- 処理時間 0.03 秒
- CPU時間 0.01 秒
work.data3は以下のように文字化けしています。EUCのファイルをUTF-8で読み込んだときに文字化けを起こしています。これをSJISで保存しようとしてエラーになっています。
今回、仕事ではまったのが、SASのインストール、構成において途中でエンコーディングの設定を変えてこのエラーにぶつかりました。しかも、文字化けして格納されたのがPostgreのデータベースの中でした。ログファイルや、データセットの中を見ても見つからずにSOURCE, MPRINTで元データを探しまわり時間を費やしました。
教訓ですが、SASをインストした後にエンコーディングを変えてから、構成しましょう。SAS Environment Managerの設定で時間が掛かったのは、このエラーのためです。
時間あるときに、サンプルのコードを修正してください。
返信削除「鈦合金」はSJISでは表現できない文字列です。
あと、エラーを抑止するRSASIOTRANSERROR オプションの指定についても追記してください。