文字のエンコーディングで良くあるエラーですが、改めて問題を定義します。このエラーは、異なるエンコーディングへ文字が変換できなかったときに発生します。
理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードは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の設定で時間が掛かったのは、このエラーのためです。