理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードは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;エラーは、SJISのデータセットを出力するときに発生します。
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 オプションの指定についても追記してください。