2016年10月19日水曜日

INFILEステートメントの DSD MISSOVER の挙動





「INFILEで外部ファイルを読み込むときに指定する ”DSD MISSOVER” ってどういう役割してるの?」
って質問をよくもらいます。

具体例で各オプションの役割を見ていきましょう。



DSDの役割


読み込み対象のCSVファイル … C:\test\sample1.csv
1,,2



CSVファイルの読み込み
*** DSDを指定した場合 ;
data OUT1;
  infile "C:\test\sample1.csv" dlm="," dsd missover ;
  input A B C;
run;
  A  
  B  
 C 
  1   .   2   

*** DSDを指定しない場合 ;
data OUT1;
  infile "C:\test\sample1.csv" dlm="," dsd missover ;
  input A B C;
run;
  A  
  B  
 C 
  1   2  .   


上記テキストファイルで「1,,2」 というように区切り記号が連続する部分を欠損値として扱うかどうかを設定しているわけですね。




MISSOVERの役割


読み込み対象のCSVファイル : C:\test\sample2.csv
1,2
3,4,5



CSVファイルの読み込み
*** MISSOVERを指定した場合 ;
data OUT2;
  infile  "C:\test\sample2.csv" dlm="," dsd missover ;
  input A B C;
run;
  A  
  B  
 C 
  1   2  .   
  3   4  5  

*** MISSOVERを指定しない場合 ;
data OUT2;
  infile  "C:\test\sample2.csv" dlm="," dsd missover ;
  input A B C;
run;
  A  
  B  
 C 
  1   2  3   


input A B C;」 というように変数を3つ割り当てていますが、
テキストファイルの1行目は 「1,2」 となっているので変数Cを割り当てるデータがありません。
(変数Cを欠損値にしたいのであれば 「1,2,」 というように区切り記号を最後にもつけなきゃダメです)

なので、SASは足りない部分を次の行から取ってこようとしちゃいます。
MISSOVERは足りない部分を「欠損値で埋める」という処理をしてくれます。



関連記事
テキストファイル(CSVなど)の読み込みと注意点 【INFILE編】

0 件のコメント:

コメントを投稿