外部ファイルの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;