IMPORTプロシジャでCSVファイルを読み込む際の文字切れを回避する

[OS] ALL
[リリース] SAS 8.2以降
[キーワード] IMPORT, CSV file, length, GUESSINGROWS

[質問]

IMPORTプロシジャでCSVファイルを読み込む際に、文字変数の値が切れてしまうことがあります。
変数の長さを指定するなどで文字切れを回避することはできますか。

[回答]

直接変数の長さを指定することはできませんが、最新のSAS9ではIMPORTプロシジャで新たに追加されたGUESSINGROWS=オプションで対応できます。
このオプションで指定された範囲内のデータから、変数,データ型,データ長を判断します。
オプション指定には事前に読み込む最大の行数を指定します。
指定可能な値の範囲は1〜32767までです。

次の例では、GUESSINGROWS=オプションを使用して先頭から200行までのデータを事前に読み込み、データの判定を行なわせています。

例:GUESSINGROWS=オプションで先頭から200行を読み込む


  PROC IMPORT OUT= WORK.test
    DATAFILE="C:¥temp¥test.csv"
    DBMS=CSV REPLACE;
    GETNAMES=YES;
    DATAROW=2;
    GUESSINGROWS=200;  /* 先頭から 200行を読み込む */
  RUN; 

なお、SAS 8のIMPORTプロシジャは、標準ではCSVファイルの先頭の20行を走査して、変数の長さが決定されます。

先頭の21行目以降に最大長のデータが存在する場合、変数の長さを判定させるには、次のような方法で対応可能です。

【対応1】  SASレジストリ修正で最初に読み込む行数の設定値を変更する
  1. SASを起動し、メニューの [ソリューション] → [アクセサリ] → [レジストリエディタ]を選択する。
  2. 左側のツリーを[PRODUCTS] → [BASE] → [EFI] の順に展開する。
  3. 右側の「GuessingRows」を選択して右クリックメニューから変更を選択する。
  4. 「値のデータ」を20から適当な大きさに変更し、OKをクリックする。たとえば、先頭50行を対象にしたい場合は「50」を入力する。
  5. レジストリエディタを閉じる。

ここで設定した行数をもとに、変数の長さが決定されるようになります。

【対応2】  データの先頭行にダミーの最長データを挿入しておく
上記【対応1】の方法では、最長行が何行目にあるかあらかじめ把握しておく必要があります。
また、あまりに大きな値を設定するとパフォーマンスが劣化する可能性も考えられます。
このような場合、データの先頭行にあらかじめ最長データを挿入しておくことで文字切れを回避します。