はじめに
期間粒度別(日次・週次・月次)にcsvデータが連携された場合に、SASでcsvデータの縦結合を行う方法を紹介します。また、実務でのコードの取り扱い方法についても紹介します。
なお、今回使用するサンプルデータは、Githubにアップしてあります。
使用するデータについて
使用するデータは、商品ごとの日別売上件数データです。データ取得期間は、2024年4月から2024年8月の5か月間です。今回は、毎月月末に1か月分の商品販売実績が、連携されることを想定しています。
| カラム名 | データ型 | 説明 |
|---|---|---|
| 日付 | 数値 | 商品販売日次 |
| 商品A | 数値 | 商品Aの販売件数 |
| 商品B | 数値 | 商品Bの販売件数 |
| 商品C | 数値 | 商品Cの販売件数 |
利用環境について
SAS® OnDemand for Academics: Studioから利用できるSAS studioを使用しています。
コード
複数のcsvを縦結合するSASのコードは以下の通りです。
/*自身の環境に応じてフォルダパスを修正してください。*/
%let path = /home/username/filename;
Filename FL ("&path/*.csv");
data OUT;
infile FL dsd missover eov=eov;
eov = 0;
input @;
if _N_ ^= 1 and eov ^= 1 then do;
/*csvの中身に応じてinputの中を修正してください。*/
input
'日付'n : $8.
'商品A'n : $3.
'商品B'n : $4.
'商品C'n : $2.
;
output;
end;
run;
最初に、%LETステートメントで、変数pathにフォルダパスを割り当てます。今回のコード例では、/home/username/filenameを割り当てています。
次に、Filenameステートメントで、/home/username/filenameの直下のcsvファイルを取得します。格納されているすべてのcsvファイルを取得するには、*.csvとします。&pathを使うことで、%LETステートメントで割り当てた、変数pathを参照することが可能です。
ここまで、完了したら、csvを読み込み結合します。infileステートメントで、読み込むファイルを指定します。事前にFLにはcsvのファイルが割り当てられているので、infile FLとすることによって、FLのファイルを指定することになります。dsdは、dlmオプションで指定された文字が連続した場合は、欠損値を格納するオプションです。dsd dlm=','というような使われ方ですが、csvの際はdsdだけ使用も可能です。missoverは、同じ行でinputステートメントの中の変数の数と区切られたデータの数が一致しない場合に、欠損値を返します。inputステートメントの変数の数は、今回は4変数となります。
ここで、今回5つのcsvファイルがありますが、最初に読み込んだcsvファイルの1行目に_N_=1フラグが、2つ目以降のcsvファイルの1行目にはeov=1のフラグが立ちます。if _N_ ^= 1 and eov ^= 1 then do;とすることで、各csvの2行目以降のデータが取得されinputされるようになっています。
inputの中身は、csvの内容に応じてカラム名やデータ型を記載します。例えば、'日付'n : $8は日付のカラムについて、8桁の数値で取得することを意味しています。
最後に
実際に実務で取り扱う場合は、自身の環境やcsvデータの中身に応じて、上記コードの%LETのフォルダパスとinputのカラム名やデータ型を修正することのみを意識しておけばよいです。
参考文献
- SASYAMA, "filenameで複数ファイルを一括指定して、読み込む場合に各ファイル1行目がラベル行だと、難しいことになるがeovをうまく使えば解決できる話", "データステップ100万回 SAS新手一生", 2015/6, https://sas-tumesas.blogspot.com/2015/06/filename1eov.html, (参照 2025/12/25)
- a.matsu, "INFILEステートメントの DSD MISSOVER の挙動", "SAS備忘録", https://sas-boubi.blogspot.com/2016/10/infile-dsd-missover.html, (参照 2025/12/25)
- 高浪 洋平, 舟尾 暢男, 『統計解析ソフト「SAS」 改訂版』, カットシステム, 2015