2016年8月7日日曜日

ERROR: トランスコード時に文字データが一部損失しました。

文字のエンコーディングで良くあるエラーですが、改めて問題を定義します。このエラーは、異なるエンコーディングへ文字が変換できなかったときに発生します。

理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードは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の設定で時間が掛かったのは、このエラーのためです。

1 件のコメント :

  1. 時間あるときに、サンプルのコードを修正してください。
    「鈦合金」はSJISでは表現できない文字列です。
    あと、エラーを抑止するRSASIOTRANSERROR オプションの指定についても追記してください。

    返信削除