SASでExcelのスプレッドシートを読み込む方法

SASでExcelのファイルを読み込む場合、PROC IMPORTを使う方法とLIBNAMEを使う方法があります。どちらの方法でもエンジンを利用します1

エンジンは、ファイルからの読み取りやファイルへの書き込みを行うSASのコンポーネントです。各エンジンを使用することで、SAS Systemは特定の形式のファイルにアクセスできるようになります。エンジンには複数の種類があります。 SAS Help Center: SASエンジンの定義

Excelのファイルを扱うエンジンは、XLS、XLSX、EXCELの3種類です。

拡張子.xlsならXLSかEXCELを利用して、.xlsxならXLSXかEXCELを利用します。

詳しくはこのPDF(英語)に書いてありますが、ここでも簡単にまとめてみます。

Excelは閉じるように!

Excelでスプレッドシートを開いたままそのファイルをSASで読み込もうとするとエラーになるので注意。

XLSX

.xlsxファイルはLIBNAMEでもPROC IMPORTでも読み込めます。

XLSXファイルをLIBNAMEで読み込む

以下のようなdata.xlsxを用意しました。

Sheet1:

NameAgeColor
Sato23Blue
Suzuki19Green
Smith28Red

まずPROC CONTENTSを使って読み込むシートを見つけます。

/* マクロ変数にデータを保存しているパスを割り当てる */
%let path = C:\Files\sas;
libname mylib XLSX "&path\data.xlsx";

proc contents data=mylib._ALL_;
run;

最初に表示されるのはファイル全体の情報で、その後にスプレッドシート内の各シートの情報が表示されます。

image

該当するシートの「データセット名」をコピーします。シートごとに変数名などが表示されるので、読み込みたいシートを見つけてください。

今回読み込んだファイルにはSheet 1というシートしかありませんが、SASではMYLIB.SHEET1というデータセットとしてアクセスできます。

データセットをsetで読み込みます

%let path = C:\Files\sas;
libname mylib XLSX "&path\data.xlsx";

data exceldata;
    set MYLIB.SHEET1;
run;

proc print data=exceldata;
run;

このように表が表示されたので、これでちゃんと読み込めました。

image

XLSXファイルをPROC IMPORTで読み込む

一つのシートしか読み込む必要がないのであれば、PROC IMPORTを使った方がシンプルかもしれません。

proc import datafile="&path\data.xlsx"
    out = work.exceldata
    dbms = xlsx
    replace;
    sheet ="Sheet1";
run;

PROC IMPORTステートメントのオプションなど:

OUTオプション

  • 出力するSASデータセットを「ライブラリ参照名.データセット名」形式で指定する

DATAFILEオプション

  • 入力するCSVファイルのパスとファイル名を指定する

DBMSオプション

  • CSVファイルの場合は「CSV」を指定する

REPLACEオプション

  • 出力データセットが存在したら置き換えを行なう場合に指定する

GETNAMESステートメント

  • 先頭行を変数名として使う場合は「YES」を指定する

DATAROWステートメント

  • データの開始行を指定する

CSVファイルの入力方法について

XLS

XLSエンジンはLIBNAMEに対応していないので、PROC IMPORTを使います。

XLSファイルをPROC IMPORTで読み込む

%let path = C:\Files\sas;

proc import datafile="&path\data.xls"
    out = work.exceldata
    dbms = xls
    replace;
	sheet = "Sheet1";
run;

dbmsはxlsにします。

EXCELエンジンを使った場合

SASのWindows版を利用していて、Excelの64bit版を利用していれば、xlsファイルでもxlsxファイルでもEXCELエンジンを利用するという選択肢もあります。

EXCELを利用した場合、PROC CONTENTSで表示される「データセット名」も違うので注意が必要です。

LIBNAME

libname mylib EXCEL "&path\data.xlsx";

proc contents data=mylib._ALL_;
run;

data exceldata;
    set MYLIB.'Sheet1$'n;
run;

proc print data=exceldata;
run;

PROC IMPORT

%let path = C:\Files\sas;

proc import datafile="&path\data.xlsx"
    out = work.exceldata
    dbms = excel
    replace;
    sheet ="Sheet1";
run;

proc print data=exceldata;
run;

dbmsはexcelを指定します。

1

LIBNAMEでエンジンを指定しなくても、PROC IMPORTのDBMSオプションを設定すると、裏でエンジンを利用してファイルを読み込んでくれるみたいです。→"DBMS=EXCEL uses the EXCEL LIBNAME engine transparently." SAS Help Center: Syntax: PROC IMPORT PROC IMPORT Statement