ENCODING=データセットオプションを指定する場合、出力データセットのエンコーディングでは、元のデータセットより多くのスペースが必要になります。たとえば、UTF8エンコーディングを使用してWindows環境でDBCSデータを書き出す場合は、各DBCS文字に3バイトが必要です。データの切り捨てを避けるには、各変数で元のデータの幅より1.5倍広い幅が必要になります。
トランスコーディングを必要とするSASデータファイルを処理する場合は、CVP (文字変数埋め込み)エンジンに文字変数の長さの拡張を要求して、文字データの切り捨てが発生しないようにできます
(変数の長さは、各変数の値を保存するために使用するバイト数です)。文字データの切り捨ては、1つのエンコーディングにおける1文字のバイト数が、別のエンコーディングにおける同じ文字のバイト数と異なる場合に発生する可能性があります。
たとえば、1バイト文字セット(SBCS)を、2バイト文字セット(DBCS)やマルチバイト文字セット(MBCS)にトランスコードする場合などです。SBCSでは各文字を1バイトで表すのに対し、DBCSでは各文字を2バイトで表します。MBCSは、1から4バイトのさまざまな長さで文字を表します。たとえば、Wlatin2からUTF-8などのUnicodeエンコーディングにトランスコーディングする場合、変数の長さ(バイト単位)は値を保持するのに不十分であり、結果として文字データが切り捨てられることになります。
CVPエンジンを使用して、トランスコーディングの前に変数の長さが拡張されるように拡張量を指定し、それからデータを処理します。CVPエンジンは、トランスコーディングに向けてデータの準備を行うために使用される中間エンジンと考えてください。長さが増えた後は、デフォルトのベースエンジンなどの主エンジンを使用して実際のファイル処理が行われます。
CVPエンジンは、SASデータファイル限定の読み取り専用エンジンです。文字変数の拡張要求(たとえば、LIBNAMEステートメントを使用)は、次のいずれかの方法で実行できます。
-
CVPエンジンを明示的に指定し、変数の長さの1.5倍のデフォルト拡張を使用します。
-
LIBNAMEのCVPBYTES=オプションまたはCVPMULTIPLIER=オプションにより、CVPエンジンを暗黙的に指定します。これらのオプションにより、拡張量を指定します。さらに、CVPENGINE=オプションを使用して、SASファイルの処理で使用する主エンジンを指定できます。デフォルトは、デフォルトのSASエンジンです。
たとえば、次のLIBNAMEステートメントでは、CVPエンジンを明示的に割り当てています。文字変数の長さは、長さを1.5倍にするデフォルト拡張を使用して増やします。たとえば、長さが10の文字変数の新しい長さは15になり、長さが100の文字変数の新しい長さは150になります。
libname expand cvp ' SAS data-library';
注: 拡張量は、どのような拡張にでも対応できるよう十分大きくする必要があります。大きさが不十分な場合は切り捨てが発生します。
注: WHERE式を使用してオブザベーションのサブセットを条件付きで選択する処理の場合は、CVPエンジンを使用するとパフォーマンスに影響することがあります。CVPエンジンを使用しない場合のファイルの処理は、CVPエンジンを使用する場合のファイルの処理より高速です。たとえば、CVPエンジンを使用する場合は、データセットにインデックスがあっても、WHERE式を最適化するためにそのインデックスは使用されません。