2-1. 外部ファイルからのデータ読み込み

Sample 1-1ではDATALINESステートメントを用いてDATAステップの中に読み込むべきデータを置きました。データ量が少ないうちはこの方法でも良いのですが、データが多くなってくるとDATAステップの中にデータを置くのは現実的ではありません。

そこで読み込むべきデータを別にテキストファイルとして用意し、そこから読み込む方法を学びます。これは “1-4. DATAステップ ②読み込むデータの場所” で解説した “(ⅱ)外部の(テキスト)ファイル” の場合に該当します。

INFILEステートメント

読み込むデータが外部のファイルであることを指定するにはINFILEステートメントを用います。DATAステップにINFILEステートメントがあると、SASはINFILEステートメントで指定された外部ファイルからデータを読み込みます。INFILEステートメントは次のように記述します。

infile '外部ファイルの絶対パス' [ オプション ] ;

それでは、Sample 1-1 と同じことを外部ファイルからデータを読み込むようにして実行してみます。まずは、Sample 1-1 のデータ部分をメモ帳などのテキストエディタにコピーして、data2-1.txt という名前で適当なフォルダに保存します。以降では、ドキュメントフォルダの中の「SASチュートリアル」というフォルダにデータファイルやプログラムを保存していきます。外部ファイルにデータを用意するときはデータの始まりを示す datalines; およびデータの終わりを示す ;(セミコロン)は必要ありません。

【data2-1.txt】

1  AIZAWA     2 C 159.5 53.3 55.5 168.6
2  KONNO      2 B 149.6 63.5 65.6 151.1
3  YAMAZAKI   1 C 177.5 73.0 71.6 168.0
4  NAKAMURA   2 B 160.3 64.5 66.5 162.8
5  HARASHIMA  1 C 170.0 80.0 78.7 158.5
6  SHINODA    1 B 174.3 73.5 71.9 159.8
7  ITO        1 A 169.2 56.3 55.3 163.2
8  SASAKI     1 B 167.7 59.0 57.2 162.0
9  MAEDA      1 B 165.9 53.6 52.3 162.5
10 ITO        2 A 150.0 43.5 45.1 167.0
11 OGAWA      1 C 160.9 48.8 47.4 161.0
12 KATO       1 A 164.3 76.0 74.8 160.6
13 OZAWA      2 B 159.8 67.9 69.5 168.7
14 TANAKA     2 C 160.4 53.0 54.6 164.6
15 UCHIDA     2 B 155.4 56.2 57.6 156.6
16 MATSUSHITA 2 C 155.6 60.3 61.9 171.5
17 SAKAMOTO   2 C 163.4 51.0 52.8 167.5
18 UTSUMI     2 B 165.0 58.8 61.1 151.2
19 SUGITA     2 C 159.1 46.9 48.6 161.0
20 KOBORI     1 A 171.4 77.3 75.6 155.0



data2-1.txtを保存したらエディタに次のプログラムを入力し、実行します。コメント部分は入力しなくても構いません。

INFILEステートメントの絶対パスの指定で、Windowsの環境変数 %USERPROFILE% を用いています。必要であればご自身の環境に合わせてパスの指定を適切なものに変更してください。環境変数についてはいろいろなところに解説がありますので、ここでは説明は省略します。

また、表示フォントの関係でフォルダの区切り記号が \(バックスラッシュ)になっていますが、日本語のフォントでの ¥(円記号)と同じものです。

ODA の SAS Studio を使用している場合は、外部ファイルの絶対パスはSASサーバーが動いている仮想マシン上のパスになります。絶対パスはファイルのプロパティを表示することで確認できます。左側ペインに表示されているデータファイルを選択して、上部の「ファイルのプロパティ」ボタンをクリックするとファイルのプロパティが表示され、場所の欄に絶対パスが表示されています。例えば、ホームフォルダの下のtutrialフォルダにdata2-1.txtを保存していれば、'/home/<ユーザー名>/tutrial/data-2-1.txt' のようになるはずです。この場合のフォルダの区切り文字はバックスラッシュ \ ではなく、通常のスラッシュ / です。

【Sample 2-1】

/* Sample 2-1 */

data ds21;
  /* 次の infile で data2-1.txt からデータを読むように指示 */
  infile '%userprofile%\documents\SASチュートリアル\data2-1.txt';
  input id name $ sex grade $
        height weight1 weight2 father;
run;

/* データセットを表示する */
proc print data=ds21;
run;



これにより Sample 1-1 を実行したときに作成した ds11 と同じ内容のデータセットds21が作成され(データセット名が異なるのでデータセットとしては別のものです)、その内容が結果ページに表示されます。

Sample 2-1 は sample2-1.sas としてSASチュートリアルフォルダに保存しておきます。

data2-1 は日本語(全角文字や半角カナ)を含んでいないため問題にはなりませんでしたが、もしもデータの中に日本語のデータが含まれている場合は文字コードに注意しなければなりません。製品版SASは文字コードが Shift-JIS なので、データファイルも Shift-JIS で保存されていなければなりません。一方、ODAは文字コードが UTF-8 なので、データファイルも UTF-8 で保存されていなければなりません。データに日本語が含まれていない場合は気にする必要はありません。データファイルだけでなく、SASプログラムも同様なのですが、SASのエディタで編集・保存している限りは特に意識する必要はありません。


INFILEステートメントのオプション

INFILEステートメントで指定されたファイルは特に何も指定しないとDATAステップの中にDATALINESステートメントを使ったとき同様、各データはスペースで区切られていると判断します。しかしエクセルなどを使ってデータを準備する場合、スペースよりも ,(カンマ)で区切られているようにした方が便利です。INFILEステートメントのdlmオプションを使うと任意の区切り文字を指定できます。例えばカンマが区切り文字であることを指定するためには、次のように書きます。

infile '%userprofile%\documents\SASチュートリアル\test.csv'
       dlm=',' ;

あるいは、データにカンマが含まれている場合など、区切り文字がカンマでは都合の悪い場合もあります。そのような場合はタブ区切りを用いますが、区切り文字がタブ文字であることを指定するためには、次のように書きます。

infile '%userprofile%\documents\SASチュートリアル\test.csv'
       dlm='09'x ;


また、特に指定しない限りデータの読み込みはデータファイルの1行目から行われますが、INFILEステートメントの firstobs オプションを使うと読み込みを開始する行を指定できます。例えば、

infile '%userprofile%\documents\SASチュートリアル\test.csv'
       dlm=',' firstobs=4 ;

と書くと、SASはカンマ区切りのデータファイルの初めの3行をとばして、4行目からデータの読み込みを開始します。このオプションを使うとエクセルなどでデータを準備して見出しをつけているときに、わざわざ見出しを削除してCSVファイルに保存する必要がなくなるので便利です。

SASはデータを読み込むときにデータ行を一度メモリ上のバッファに移します。このバッファのサイズがデフォルトでは32767(=215-1)バイト(1バイトは半角1文字)になっているため、特に指定しない限りデータ行の1行が32767バイトを超える部分を読むことはできません。以前はこのサイズが256バイトしかなかった(!)ため、少し大きめのデータを扱おうとするとすぐにこの制限が問題になったのですが、現在ではよほど大きなデータを扱うのでない限りは問題になることはないでしょう。ちなみにこのバッファサイズを指定するにはINFILEステートメントのlreclオプションを使います。


エクセルのワークシートで用意したデータを読み込む

それではエクセルのワークシートに入力されたデータを一度CSV形式のファイルに保存してSASに読み込んでみます。data2-2.xlsx には Sample 1-1 や Sample 2-1 で読み込んだデータと同じ変数で件数の多いデータがエクセルのシートに入力されています。data2-2.xlsx を開いて内容を確認してください。その後、データが入力されたシートをCSV形式で data2-2.csv として SASチュートリアルフォルダに保存します。メモ帳などのテキストエディタで data2-2.csv を開いて、どのようなファイルになっているかを確認してください。

※ CSV形式のファイルとはテキストファイルの一種で、一行の中のデータ単位を ","(半角のカンマ)で区切って保存されているものです。CSV=Comma Separated Values

エクセルでCSVファイルとして保存した後は、保存したファイルは閉じるようにしてください。エクセルで開いたままだとエクセルがファイルをロックしており、他のアプリケーションからアクセスできないようになっています。SASでファイルからデータを読もうとしてもデータファイルにアクセスできないとしてエラーになってしまいます。

Windows上のExcelで日本語を含むシートをCSVファイルとして保存すると文字コードは自動的にShift-JISになります。

次のプログラムをエディタに入力します。コメント部分は入力しなくても構いません。入力したらプログラムをサブミットして、結果ビューアウィンドウまたはアウトプットウィンドウに50件のデータが表示され、データセットが正しく作成されたことを確認してください。

Sample 2-2 は sample2-2.sas として、SASチュートリアルフォルダに保存しておきます。

【Sample 2-2】

/* Sample 2-2 */

data ds22;
  /* infile にオプションを指定して、
     カンマ区切りファイルを2行目から読む */
  infile '%userprofile%\documents\SASチュートリアル\data2-2.csv'
          dlm=',' firstobs=2;
  input	id name $ sex grade $
	height weight1 weight2 father;
run;

/* データセットを表示する */
proc print data=ds22;
run;


INFILEステートメントのオプションをそれぞれ外した場合にどうなるかを試してみてください。また、データファイルをCSVファイルだけでなく、タブ区切りファイルにして読み込むこともぜひやってみてください。エクセルで保存するときに、カンマ区切りではなくタブ区切りでデータファイルを保存して、INFILEステートメントの dlm オプションを変えるだけです。



これで、エクセルで準備したデータをSASに読み込んでデータセットを作成し、分析に用いることができるようになったはずです!