2016年8月7日日曜日

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

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

理解を深めるために、具体的にエラーを引き起こすコードを示します。このコードはEUCのテキストファイルをわざとUTF-8で読み取ってデータセット化し、SJISのエンコーディングで保存しています。
  1. data data1(encoding='utf-8');  
  2.  length name $16;  
  3.  input name;  
  4.  cards;  
  5. 与太郎  
  6. 助六  
  7. 正蔵  
  8. 円楽  
  9. 八雲  
  10. ;;  
  11. run;  
  12.   
  13. data _null_;  
  14.  set data1;  
  15.  file 'c:\temp\euc.txt' encoding='jeuc';  
  16.  put name;  
  17. run;  
  18.   
  19. data data2(encoding='utf-8');  
  20.  infile 'c:\temp\euc.txt' encoding='jeuc';  
  21.  length name $16;  
  22.  input name;  
  23. run;  
  24.   
  25. data data3(encoding='utf-8');  
  26.  infile 'c:\temp\euc.txt' encoding='utf-8';  
  27.  length name $16;  
  28.  input name;  
  29. run;  
  30.   
  31. data data4(encoding='sjis');  
  32.  set data3(encoding='utf-8');  
  33. run;  
エラーは、SJISのデータセットを出力するときに発生します。
  1. 362  data data1(encoding='utf-8');  
  2. 363      length name $16;  
  3. 364      input name;  
  4. 365      cards;  
  5.   
  6. NOTE: データセットWORK.DATA1は5オブザベーション、1変数です。  
  7. NOTE: DATAステートメント処理(合計処理時間):  
  8.       処理時間           0.03 秒  
  9.       CPU時間            0.01 秒  
  10.   
  11.   
  12. 371  ;;  
  13. 372  run;  
  14. 373  
  15. 374  data _null_;  
  16. 375      set data1;  
  17. 376      file 'c:\temp\euc.txt' encoding='jeuc';  
  18. 377      put name;  
  19. 378  run;  
  20.   
  21. NOTE: 出力ファイル'c:\temp\euc.txt' :  
  22.       ファイル名=c:\temp\euc.txt,  
  23.       レコードフォーマット=V,  
  24.       論理レコード長=65534,  
  25.       ファイルサイズ (バイト)=0,  
  26.       更新日時=20160807日 132831秒,  
  27.       作成日時=20160807日 130649秒  
  28.   
  29. NOTE: 5レコードを出力ファイル'c:\temp\euc.txt'に書き込みました。  
  30.       最小レコード長は6です。  
  31.       最大レコード長は9です。  
  32. NOTE: データセットWORK.DATA1から5オブザベーションを読み込みました。  
  33. NOTE: DATAステートメント処理(合計処理時間):  
  34.       処理時間           0.01 秒  
  35.       CPU時間            0.01 秒  
  36.   
  37.   
  38. 379  
  39. 380  data data2(encoding='utf-8');  
  40. 381      infile 'c:\temp\euc.txt' encoding='jeuc';  
  41. 382      length name $16;  
  42. 383      input name;  
  43. 384  run;  
  44.   
  45. NOTE: 入力ファイル'c:\temp\euc.txt' :  
  46.       ファイル名=c:\temp\euc.txt,  
  47.       レコードフォーマット=V,  
  48.       論理レコード長=65534,  
  49.       ファイルサイズ (バイト)=32,  
  50.       更新日時=20160807日 132831秒,  
  51.       作成日時=20160807日 130649秒  
  52.   
  53. NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。  
  54.       最小レコード長は6です。  
  55.       最大レコード長は9です。  
  56. NOTE: データセットWORK.DATA2は5オブザベーション、1変数です。  
  57. NOTE: DATAステートメント処理(合計処理時間):  
  58.       処理時間           0.01 秒  
  59.       CPU時間            0.01 秒  
  60.   
  61.   
  62. 385  
  63. 386  data data3(encoding='utf-8');  
  64. 387      infile 'c:\temp\euc.txt' encoding='utf-8';  
  65. 388      length name $16;  
  66. 389      input name;  
  67. 390  run;  
  68.   
  69. NOTE: 入力ファイル'c:\temp\euc.txt' :  
  70.       ファイル名=c:\temp\euc.txt,  
  71.       レコードフォーマット=V,  
  72.       論理レコード長=131068,  
  73.       ファイルサイズ (バイト)=32,  
  74.       更新日時=20160807日 132831秒,  
  75.       作成日時=20160807日 130649秒  
  76.   
  77. NOTE: 5レコードを入力ファイル'c:\temp\euc.txt'から読み込みました。  
  78.       最小レコード長は4です。  
  79.       最大レコード長は6です。  
  80. NOTE: データセットWORK.DATA3は5オブザベーション、1変数です。  
  81. NOTE: DATAステートメント処理(合計処理時間):  
  82.       処理時間           0.03 秒  
  83.       CPU時間            0.01 秒  
  84.   
  85.   
  86. 391  
  87. 392  data data4(encoding='sjis');  
  88. 393      set data3(encoding='utf-8');  
  89. 394  run;  
  90.   
  91. NOTE: データファイルWORK.DATA4.DATAは別なホストにネイティブな形式が使用  
  92.       されているか、またはエンコーディングがセッションエンコーディ  
  93.       ングと一致していません。クロス環境データアクセスが使用される  
  94.       ため、追加のCPUリソースが必要となり、パフォーマンスが低下しま  
  95.       す。  
  96. ERROR: データセットWORK.DATA4のトランスコード時に文字データが一部損失  
  97.        しました。新しいエンコーディングで表せない文字がデータに含ま  
  98.        れていたか、またはトランスコード時に切り捨てが発生しました。  
  99.   
  100. NOTE: DATAステップは異常終了しました。  
  101. NOTE: エラーが発生したため、このステップの処理を中止しました。  
  102. NOTE: データセットWORK.DATA3から3オブザベーションを読み込みました。  
  103. WARNING: データセットWORK.DATA4は未完成です。このステップは、  
  104.          2オブザベーション、1変数で停止しました。  
  105. WARNING: このステップを中止したため、データセットWORK.DATA4を置き換えて  
  106.          いません。  
  107. NOTE: DATAステートメント処理(合計処理時間):  
  108.       処理時間           0.03 秒  
  109.       CPU時間            0.01 秒  

work.data3は以下のように文字化けしています。EUCのファイルをUTF-8で読み込んだときに文字化けを起こしています。これをSJISで保存しようとしてエラーになっています。


今回、仕事ではまったのが、SASのインストール、構成において途中でエンコーディングの設定を変えてこのエラーにぶつかりました。しかも、文字化けして格納されたのがPostgreのデータベースの中でした。ログファイルや、データセットの中を見ても見つからずにSOURCE, MPRINTで元データを探しまわり時間を費やしました。

教訓ですが、SASをインストした後にエンコーディングを変えてから、構成しましょう。SAS Environment Managerの設定で時間が掛かったのは、このエラーのためです。

1 件のコメント :

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

    返信削除