2016年4月7日木曜日

INPUTステートメントで、空白を含むテキストを1変数に読み込む方法


以下のようなテキストファイルがあったとします。

C:\TEST.txt
 SAS boubi roku
 I'm a.matsu


このファイルを読み込んで以下のデータセットを作りたいとする。
 TEXT  
 SAS boubi roku 
 I'm a.matsu



失敗例

data DT1;
    length TEXT $2000.;
    infile "C:\TEST.txt"  lrecl=32767;
    input TEXT;
run;
  TEXT   
 SAS
 I'm

テキスト中の半角スペース(空白)が区切り文字として解釈されるので文字が切れてしまいます。



解決案 : 自動変数 _INFILE_ を使う


解決案は色々ありますが、今回は自動変数 「_INFILE_」 を使ってみます。
(注意事項を追記したので、記事の最後までご覧ください)

data DT2;
    length TEXT $2000.;
    infile "C:\TEST.txt"  lrecl=32767;
    input ;
    TEXT = _infile_;
run;
 TEXT  
 SAS boubi roku 
 I'm a.matsu


解説
  infile "C:\TEST.txt"  lrecl=32767;

まず読込むテキストファイルを指定。
また「LRECL=」で1レコードに読み込める最大バイト数を指定しています。この設定値が小さいと文字切れの原因になるので、例では最大設定値(環境によって異なる可能性あり)の「32767」を設定。
それと、LENGTHも32767にしてしまうと、ファイルサイズが大きくなってしまうので、実データにあわせた長さに適宜設定します。


  input;

テキストファイルを1レコード読み込みに行きます。
ただしINPUTの後に変数の指定がないので、変数への出力はしません。


  TEXT = _infile_;

自動変数「_INFILE_」には入力バッファの内容が格納されています。
つまりテキストファイルから読込んだ1レコード分全文字が格納されています。
この文字を変数TEXTに代入すれば出来上がりです。


📝注意

テキストファイルで「先頭に半角スペースを含むレコード」がある場合は注意。
「今回の方法で変数に読み込んだら先頭の半角スペースが消えてしまった」とご報告頂きました。
私のほうでテストしたところ、問題なくスペースを保持することが出来ましたが、環境依存の可能性もあるので、各自の環境で挙動確認したほうが良さそうです。

ちなみに、ご報告頂いた内容とは別件かもですが、変数値の先頭に半角スペースがあっても、表示上、スペースが消えてみえることがあります。
例えばPROC PRINTで変数値を表示すると先頭の半角スペースが消えてみえます。
実際の格納値と異なるため、混乱のもとになりがちです。



関連記事
「input &」で空白を含むテキストを1変数に読み込む


0 件のコメント:

コメントを投稿