CSVファイルのサンプリング

Last-modified: 2008-06-30 (月) 14:01:16

外部ファイルのCSVを取り込む処理はよく行われます.大きさと作業目的によっては,CSVファイルを事前にサンプリングしたい場合もあると思います.
ここでは,SASデータセットを作らずに,CSVファイルを適当なサンプリングロジックで間引いたCSVファイルをつくる方法を紹介します.
基本的な処理の流れ

  • data _null_ステップで,SASデータセットを作らずに処理します.
  • INFILEステートメントで指定した元CSVから読み込んだデータ列を,FILEステートメントで指定された出力CSVにそのまま書き出します.
  • 個々の項目を変数に読み込まないので,読み込みバッファである自動変数_INFILE_を使います.
  • サンプリングには,乱数を使ったり,業務に応じたロジックを組みます.下記の例では,カンマで区切られた第1項目のキーの下2桁目が1である場合にPUTステートメントでデータの書き出し処理を行っています.
data _null_;
  infile "master.csv" lrecl=32767;
  file   "sample.csv" lrecl=32767;
  input;
  if mod(int(scan(_infile_,1)/10),100)=1 then put _infile_;
  *if _n_>1000 then stop;
run;

もし,_INFILE_変数を使いたくなければ,読み込みバッファの内容を格納する適当な変数(ここでは,buffer)を用意して,$VARYINGフォーマットとインフォーマットでバッファの長さにあわせた,読み込み書き込みを行うことで,同じ結果を得ることができます.

data _null_;
  infile "master.csv" length=buffer_length lrecl=32767;
  file   "sample.csv" lrecl=32767;
  input buffer $varying32767. buffer_length;
  if mod(int(scan(buffer,1)/10),100)=1 then put buffer $varying32767. buffer_length;
  *if _n_>1000 then stop;
run;