2018年3月16日金曜日

固定長のテキストファイルで、先頭スペースを保持して読み込む




以下のテキストファイルを読み込みたいとします。


C:\test\test.txt
0 .
1 a
2  b
3   c


*** 例①:失敗例 *****;
data TEST;
   length X 8. Y $3.;
   infile "C:\test\test.txt" truncover;
   input  X 1-1
             Y 3-5;
run;

  X  
  Y  
 0   
 1  a 
 2  b 
 3  c


文字変数Yには、テキストファイルの中身通り、先頭の半角スペースを保持して以下のように読み込みたかったのですが、ふつうに読み込むとこの半角スペースは消えちゃいます。

  X  
  Y  
 0   
 1  a 
 2   b 
 3    c



先頭の半角スペースを保持するには、以下のような工夫が必要です。
(後述しますが、文字欠損値の取り扱いだけ注意が必要)

*** 例② *****;
data TEST;
   length X 8. Y $3.;
   infile "C:\test\test.txt" truncover;
   input  @X
             @Y  $char3. ;
run;

  X  
  Y  
 0 
 . 
 1 
 a 
 2 
  b 
 3 
   c


INPUT  @読み込み開始位置   変数名   $CHAR読み込む文字の長さ.」という感じで書きます。

  • 「@読み込み開始位置」で変数毎に読み込みを開始する位置を指定し、
  • インフォーマット「$CHAR」を使って先頭の半角スペースを切り捨てずに読み込んでいます
  • 「$CHAR」は文字変数として読み込むときに使います。上の例の変数Xは数値変数として読み込みたいので「$CHAR」は指定していません


注意
  • 文字欠損値の取り扱いだけ注意
    • 最初の例(例①)では、テキストファイルの1行目のドット「.」は欠損値として扱われて文字変数Yに読み込まれましたが、
    • 今回の例(例②)では、$CHARを使ったことで、テキストファイルの1行目のドット「.」がそのまま「.」という文字値として文字変数Yに読み込まれました。


その他の補足

今回の例で使用している「TRUNCOVERオプション」について知りたい方は、以下記事の最後らへんで解説しています。



0 件のコメント:

コメントを投稿