前のページ|次のページ

INFILEステートメント

INPUTステートメントで読み込む外部ファイルを指定します。

該当要素: DATAステップ
カテゴリ: ファイル操作
種類: 実行
制限事項: SASがロックダウン状態にある場合、ロックダウンパスリストに含まれていないファイルに関しては、INFILEステートメントを使用できません。詳細については、XisError: No pubcode in link data found for lrconを参照してください。
動作環境: INFILEステートメントは、動作環境に固有のマテリアルを含んでいます。このステートメントを使用する前に、各動作環境向けのSASドキュメントを参照してください。
参照項目: INFILEステートメントXisError: No pubcode in link data found for hostwinXisError: No pubcode in link data found for hostunx、およびXisError: No pubcode in link data found for hosto390

構文

引数

file-specification

入力データレコードのソースを指定します。これは外部ファイルまたは入力ストリームデータになります。File-specificationには、次の形式を指定できます。

'external-file'

外部ファイルの物理名を指定します。物理名とは、動作環境がそのファイルにアクセスするために使用する名前のことです。

fileref

外部ファイルのファイル参照名を指定します。

要件 ファイル参照名は、FILENAMEステートメントまたはFILENAME関数を使用するか、適切な動作環境のコマンドを使用して、あらかじめ前のステップで外部ファイルに関連付けておく必要があります。
参照項目 FILENAMEステートメント

fileref(file)

集約記憶域に関連付けられているファイル参照名の後に、その集約記憶域に含まれているファイルまたはメンバの名前を丸かっこで囲んで指定します。

要件 集約記憶域に格納されているファイルの名前が有効なSAS名ではない場合は、その名前を引用符で囲む必要があります。
ファイル参照名は、FILENAMEステートメントまたはFILENAME関数を使用するか、適切な動作環境のコマンドを使用して、あらかじめ前のステップで外部ファイルに関連付けておく必要があります。
動作環境 複数のファイルをまとめて保存する集約記憶域の名前は、ディレクトリ、MACLIB、区分データセットなど、動作環境によって異なります。外部ファイルの指定方法の詳細については、各動作環境向けのSASドキュメントを参照してください。
参照項目 FILENAMEステートメント

CARDS | CARDS4

定義については、DATALINESを参照してください。

別名 DATALINES | DATALINES4

DATALINES | DATALINES4

DATAステップ内のDATALINESまたはDATALINES4ステートメントの直後に入力データが続くことを指定します。DATALINESを指定すると、INFILEステートメントの各種オプションを使用して、INPUTステートメントが入力ストリームデータ行を読み込む方法を制御できます。

別名 CARDS | CARDS4
区切り文字の扱い方の変更
ヒント ERRORCHECKオプションがSTRICTに設定されている場合、SYSERRマクロ変数を使用すると、file-specificationの指定の有無を確認できます。

device-type

ファイル参照名が入力デバイスまたは出力デバイスを参照する場合や物理ファイルではない場所を参照する場合に使用する、デバイスタイプまたはアクセス方式を指定します。

ACTIVEMQ

このアクセス方式を指定すると、ActiveMQメッセージブローカーへアクセスできます。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 XisError: No pubcode in link data found for appmsgdg

CATALOG

CATALOGアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 CATALOGアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、CATALOGアクセス方式を参照してください。

CLIPBOARD

CLIPBOARDアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 CLIPBOARDアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、CLIPBOARDアクセス方式を参照してください。

DISK

デバイスがディスクドライブであると指定します。

ヒント ディスク上のファイルにファイル参照名を割り当てる場合、DISKを指定する必要はありません。

DUMMY

ファイルへの出力を破棄するように指定します。

ヒント テストを実行する場合はDUMMYを指定すると便利です。

FTP

FTPアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 FTPアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、FTPアクセス方式を参照してください。
infile dummy ftp user='myuid' pass='xxxx' filevar=file_to_read;

GTERM

出力デバイスの種類がグラフィックデータを受信するグラフィックデバイスであると指定します。

HADOOP

Hadoopアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 Hadoopアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、Hadoopアクセス方式を参照してください。

JMS

Java Message Service (JMS) の送信先を指定します。

PIPE

名前の付いていないパイプを指定します。

動作環境によっては、パイプがサポートされない場合があります。

PLOTTER

バッファなしのグラフィック出力デバイスを指定します。

PRINTER

プリンタまたはプリンタスプールファイルを指定します。

SFTP

SFTPアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 SFTPアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、SFTPアクセス方式を参照してください。

SOCKET

SOCKETアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 SOCKETアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、SOCKETアクセス方式を参照してください。

TAPE

テープドライブを指定します。

TEMP

ファイル名が割り当てられている間だけ存在する一時ファイルを作成します。この一時ファイルは論理名からのみアクセスできます。また、論理名が存在する間だけ使用できます。

制限事項 物理パス名は指定しないでください。物理パス名を指定するとエラーが発生します。
ヒント TEMPデバイスで操作されるファイルは、同じ属性を持ち、DISKファイルと同様な動作ができます。

TERMINAL

ユーザーの端末を指定します。

UPRINTER

ユニバーサル印刷プリンタの定義名を指定します。

ヒント FILENAMEステートメントにプリンタ名を指定しない場合、PRINTERPATHオプションによって、使用するユニバーサルプリンタと出力先が制御されます。

URL

URLアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 URLアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、URLアクセス方式を参照してください。

WEBDAV

WEBDAVアクセス方式を指定します。

操作 DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。
参照項目 WEBDAVアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、WebDAVアクセス方式を参照してください。
別名 DEVICE=device-type
デフォルト DISK
要件 device-typeまたはDEVICE=device-typeは、ステートメントのfile-specificationの直後に記述する必要があります。
動作環境 指定するデバイスによっては、さらに情報を指定することが必要になる場合があります。DISK以外の値を指定する前に、各動作環境向けのSASドキュメントを参照してください。動作環境によっては、ここで説明した値の他に使用できる値が存在する場合があります。

INFILEオプション

BLKSIZE=block-size

入力ファイルのブロックサイズを指定します。

デフォルト ご使用の動作環境によって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。

COLUMN=variable

変数名を指定します。指定した変数の値は、入力ポインタの現在の列位置を示す値に設定されます。自動変数と同じように、COLUMN=に指定した変数はデータセットに書き込まれません。

別名 COL=
参照項目 LINE=
ポインタ位置の出力

DELIMITER= delimiter(s)

LIST入力でブランクのかわりに使用する区切り文字を指定します。使用できるdelimiter(s)は次のとおりです。

'list-of-delimiting-characters'

区切り文字として読み込む文字を1つまたは複数指定します。

要件 指定する区切り文字のリストは引用符で囲む必要があります。
区切り文字の扱い方の変更

character-variable

文字変数の名前を指定します。指定した変数の値が区切り文字として使用されます。

別名 DLM=
デフォルト ブランク
ヒント 区切り文字では大文字と小文字が区別されます。
一般的な区切り文字としては、カンマ(,)、縦棒(|)、セミコロン(;)、タブが挙げられます。タブは16進数の文字で指定します。UNIXおよびWindows環境では、タブの値は'09'xになります。z/OS環境では、タブの値は'05'xになります。
参照項目 区切り文字で区切られたデータ値の読み込みDLMSTR=、および DSD (delimiter-sensitive data)
区切り文字の扱い方の変更

DLMSTR= delimiter

LIST入力でブランクのかわりに使用する区切り文字を指定します。使用できるdelimiterは次のとおりです。

'delimiting-string'

区切り文字として読み込む文字列を指定します。

要件 文字列は一重引用符で囲みます。
区切り文字の扱い方の変更

character-variable

文字変数の名前を指定します。指定した変数の値が区切り文字として使用されます。

デフォルト ブランク
操作 INFILEステートメントにDLMSTR=オプションを複数指定すると、最後に指定したDLMSTR=オプションが使用されます。DELIMITER=オプションとDLMSTR=オプションの両方を指定すると、最後に指定したオプションが使用されます。
RECFM=Nを指定する場合は、サイズが大きい入力項目でも十分に保持できる値がLRECLに指定されていることを確認してください。指定した値が十分ではない場合、区切り文字によってレコード境界間で分割される場合があります。
ヒント 区切り文字では大文字と小文字が区別されます。区切り文字で大文字小文字を区別するには、DLMSOPT='I'オプションを使用します。
参照項目 区切り文字で区切られたデータ値の読み込みDELIMITER=DLMSOPT=DSD
区切り文字の扱い方の変更

DLMSOPT= 'option(s)'

DLMSTR=オプションの解析オプションを指定します。ここでは、option(s)は次の値のいずれかになります。

I

大文字小文字を区別せずに比較を行うことを指定します。

T

区切り文字の末尾にあるブランクを削除するよう指定します。

ヒント Tオプションは、区切り文字として変数を使用する場合に便利です。
IT、またはその両方を指定できます。
要件 DLMSOPT=オプションは、DLMSTR=オプションを使用している場合にのみ有効です。
参照項目 DLMSTR=
区切り文字の扱い方の変更

DSD (delimiter-sensitive data)

データ値が引用符で囲まれている場合、そのデータ値内の区切り文字を文字データとして扱うことを指定します。DSDオプションを指定すると、LIST入力を使用する場合のSASによる区切り文字の扱い方を変更し、デフォルトの区切り文字をカンマに変更できます。DSDを指定すると、SASは2つの連続する区切り文字を欠損値として扱い、文字値から引用符を削除します。

操作 区切り文字を変更するには、DELIMITER=またはDLMSTR=オプションを使用します。
ヒント 引用符に囲まれている文字列内に区切り文字を含んでいる文字値を読み込むには、DSDオプションとLIST入力を使用します。INPUTステートメントは、そのような区切り文字を有効な文字として扱い、その値を格納する前に、文字列から引用符を削除します。引用符を保持するには、チルダ(~)フォーマット修飾子を使用します。
参照項目 区切り文字で区切られたデータ値の読み込みDELIMITER=、およびDLMSTR=
区切り文字の扱い方の変更

欠損値と短いレコードをリスト入力で処理する

ENCODING= 'encoding-value'

外部ファイルからの読み取り時に使用するエンコーディングを指定します。ENCODING=の値は、外部ファイルのエンコーディングが現在のセッションエンコーディングとは異なることを示しています。

外部ファイルからデータを読み込む場合は、指定したエンコーディングからセッションエンコーディングにデータがトランスコードされます。
デフォルト SASでは、外部ファイルのエンコーディングがセッションエンコーディングと同じであるとみなします。
参照項目 有効なエンコーディング値については、XisError: No pubcode in link data found for nlsrefを参照してください。
外部ファイル読み込み時のエンコードの指定

END=variable

変数名を指定します。現在の入力データレコードが最後である場合、この変数に値1が設定されます。SASが最後のデータレコードを処理するまで、END=変数には値0が設定されます。自動変数と同じように、この変数はデータセットに書き込まれません。

制限事項 END=オプションは、UNBUFFEREDオプションと一緒には使用できません。 また、複数の入力データレコードを読み込むDATALINES/DATALINES4ステートメントやINPUTステートメントでは使用できません。
ヒント END=が無効である場合、オプションEOF=を使用します。
複数の入力ファイルからの読み込み

EOF=label

ステートメントラベルを指定します。これは、INFILEステートメントがファイルの終わりに達した場合に明示的なGO TOのオブジェクトとなります。INPUTステートメントが、それ以上レコードを含んでいないファイルから読み込もうとする場合、このステートメントラベルに実行が移動されます。

操作 UNBUFFEREDオプションと一緒に使用する場合や、複数の入力データレコードを読み込むDATALINES/DATALINES4ステートメントやINPUTステートメントと組み合わせて使用する場合、END=オプションのかわりにEOF=を使用します。
ヒント EOF=オプションは、複数の入力ファイルを順番に読み込む場合に便利です。
参照項目 END=EOV=、およびUNBUFFERED

EOV=variable

変数名を指定します。一連の連結ファイルに含まれている各ファイルの最初のレコードが読み込まれた場合、この変数に値1が設定されます。この変数は、SASが次のファイルを検出した場合にのみ値が設定されます。自動変数と同じように、EOV=に指定した変数はデータセットに書き込まれません。

ヒント SASが各ファイル境界を検出した時点で、EOV=変数は0にリセットされます。
参照項目 END=およびEOF=

EXPANDTABS | NOEXPANDTABS

タブ文字を標準タブ設定に拡張するかどうかを指定します。EXPANDTABSを指定すると、タブ文字が、列9から始まる8列の間隔に設定されます。

デフォルト NOEXPANDTABS
ヒント EXPANDTABSオプションは、お使いの動作環境にネイティブなタブ文字を含むデータを読み込む場合に便利です。

FILENAME=variable

変数名を指定します。この変数には、現在開かれている入力ファイルの物理名が設定されます。一連の連結ファイルでは、この変数は、SASが次のファイルを検出した場合にのみ更新されます。自動変数と同じように、FILENAME=に指定した変数はデータセットに書き込まれません。

ヒント LENGTHステートメントを使用すると、物理ファイル名を格納できる長さにまで変数の長さを拡張できます。
参照項目 FILEVAR=
複数の入力ファイルからの読み込み

FILEVAR=variable

変数名を指定します。この変数の値が変化すると、INFILEステートメントは現在の入力ファイルを閉じ、新しいファイルを開きます。次のINPUTステートメントが実行されると、FILEVAR=変数に指定された新しいファイルから読み込みが実施されます。自動変数と同じように、この変数はデータセットに書き込まれません。

制限事項 FILEVAR=変数には、物理ファイル名を表す文字列を指定する必要があります。
操作 FILEVAR=オプションを使用すると、file-specificationは、実際のファイル名またはファイルに対して事前に割り当てられたファイル参照名ではなく、プレースホルダになります。このプレースホルダを使用して、処理情報をSASログに出力します。プレースホルダには、ファイル参照名と同じルールが適用されます。
ヒント FILEVAR=オプションを使用すると、現在開かれている入力ファイルを新しい物理ファイルに動的に変更できます。
FILEVAR=オプションを使用する場合、現在開かれている入力ファイルが最後のファイルであるかどうかを知ることはできません。DATAステップがファイル終端マーカーまたはすべての開かれているデータセットの終わりに到達すると、シャットダウンが行われます。また、FILEVARをFIRSTOBSと併用すると、複数のファイルの中でヘッダーレコードのみを含むファイルによって、DATAステップの通常のシャットダウンがトリガされます。このシャットダウンは、ファイル終端指示子を超えて読み込みを行うとDATAステップが終了するために発生します。EOF=オプションを使用すると、シャットダウンを回避することができます。
参照項目 外部ファイルの直接更新
複数の入力ファイルからの読み込み

FIRSTOBS=record-number

レコード番号を指定します。SASはこの番号を使用して、入力ファイル内の入力データレコードの読み込みを開始します。

デフォルト 1
ヒント FIRSTOBS=とOBS=を組み合わせて使用することで、ファイル内に含まれている特定の範囲のレコードを読み込むことができます。
ファイル内のヘッダーレコードをスキップするには、FIRSTOBS=2を使用します。
次のステートメントでは、50番目から100番目までのレコードを処理します。
infile file-specification firstobs=50 obs=100;

FLOWOVER

INPUTステートメントが、ステートメント内にあるすべての変数に関して、現在の入力行内に値を検出しなかった場合、次の入力データレコードを継続して読み込むようにします。FLOWOVERは、INPUTステートメントのデフォルトの動作です。

参照項目 行の終わりを超えて読み込むMISSOVERSTOPOVERTRUNCOVER

LENGTH=variable

変数名を指定します。この変数には、現在の入力ファイルの長さが設定されます。SASは、INPUTステートメントが実行されるまで、この変数に値を割り当てません。自動変数と同じように、LENGTH=変数はデータセットに書き込まれません。

ヒント このオプションは、フィールド幅が異なる場合に、XisError: No pubcode in link data found for leforinforrefと組み合わせて使用すると便利です。
可変長レコードを含むファイルの読み込み

コピーされたレコードの切り捨て

LINE=variable

変数名を指定します。この変数には、入力バッファ内の入力ポインタの行位置が設定されます。自動変数と同じように、LINE=に指定した変数はデータセットに書き込まれません。

範囲 1からN=オプションに指定された値
操作 LINE=変数の値は、INPUTステートメントでN=オプションまたは#n行ポインタコントロールによって指定された行グループ内の現在の相対行番号です。
参照項目 COLUMN=およびN=
ポインタ位置の出力

LINESIZE=line-size

INPUTステートメントで使用可能なレコード長を指定します。

別名 LS=
範囲 最大32767
操作 INPUTステートメントが、LINESIZE=に指定された列数を超えて列を読み込もうとした場合にどのようなアクションが実行されるかは、FLOWOVER、MISSOVER、SCANOVER、STOPOVER、TRUNCOVERのうちどのオプションが有効であるかにより決定されます。FLOWOVERがデフォルトです。
動作環境 line-sizeの値は、動作環境のレコードサイズによって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。
ヒント LINESIZE=を使用すると、レコード全体を読み込みたくない場合にレコード長を制限できます。
データ行の73列目から80列目までに順序番号が含まれている場合、次のINFILEステートメントを使用すると、INPUTステートメントによる読み込みを先頭から72列目までに制限できます。
infile file-specification linesize=72;

LRECL=logical-record-length

論理レコード長を指定します。

デフォルト 各動作環境のファイル特性により異なります。
制限事項 DATALINESファイル指定を使用する場合、LRECLは無効となります。
操作 かわりに、XisError: No pubcode in link data found for lesysoptsrefを使用すると、グローバルな論理レコード長を指定できます。グローバルLRECLシステムオプションのデフォルト値は32767です。固定長レコード(RECFM=F)を使用する場合、LRECLのデフォルト値は256になります。
動作環境 logical-record-lengthの値は動作環境によって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。
ヒント LRECL=オプションには、ファイルの物理的な行の長さを指定します。LINESIZE=オプションには、INPUTステートメントが読み込む行の長さを指定します。

MISSOVER

INPUTステートメントが、ステートメント内にあるすべての変数に関して、現在の入力行内に値を検出しなかった場合、新しい入力データレコードを読み込まないようにします。INPUTステートメントが現在の入力データレコードの終端に到達すると、何の値も割り当てられていない変数には欠損値が設定されます。

ヒント 最後のフィールドが欠損値であり、対応する変数に欠損値を割り当てたい場合には、MISSOVERを使用します。
参照項目 行の終わりを超えて読み込むFLOWOVERSCANOVERSTOPOVERTRUNCOVER
欠損値と短いレコードをリスト入力で処理する

N=available-lines

入力ポインタで一度にアクセスできる行数を指定します。

デフォルト DATAステップ内の任意のINPUTステートメントでの#ポインタコントロールの後に指定されている最大数。#ポインタコントロールを省略した場合、デフォルト値は1になります。
操作 このオプションは、ポインタで一度にアクセスできる行数にのみ影響します。INPUTステートメントが読み込む行数には影響しません。
ヒント N=の値よりも小さな値の#ポインタコントロールをINPUTステートメントで使用すると、予期しない結果が発生することがあります。予期しない結果を防ぐには、N=オプションの値に等しい#ポインタコントロールを含めるようにします。次に例を示します。
infile 'external file' n=5;
input #2 name : $25. #3 job : $25. #5;
レコードからデータが読み込まれなくても、INPUTステートメントには#5ポインタコントロールが含まれます。
ポインタ位置の出力

NBYTE=variable

変数名を指定します。この変数には、ストリームレコード形式でデータを読み込む場合に(FILENAMEステートメントでRECFM=Sを指定)、ファイルから読み込むバイト数が含まれます。

デフォルト ファイルのLRECL値
操作 読み込むバイト数を-1に設定すると、FTPおよびSOCKETアクセス方式は、入力バッファ内で現在使用可能なバイト数を返します。
参照項目 FILENAMEステートメントのSOCKETアクセス方式でのRECFM=オプション、およびFILENAMEステートメントのFTPアクセス方式でのRECFM=オプション

OBS=record-number | MAX

record-number では、順次読み込みの入力ファイルから読み込む最終レコードのレコード番号を指定します。
MAX では、処理するオブザベーションの最大数を指定します。この値は、少なくとも符号付き32ビット整数の最大値と同じ大きさになります。絶対最大値は、お使いの動作環境により異なります。
デフォルト MAX
ヒント OBS=とFIRSTOBS=を組み合わせて使用することで、ファイル内に含まれている特定の範囲のレコードを読み込むことができます。
次のステートメントは、ファイルに含まれている先頭から100レコードのみを読み込みます。
infile file-specification obs=100;

PAD | NOPAD

LRECL=オプションに指定された長さに達するまで、外部ファイルから読み込むレコードにブランクを追加するかどうかを指定します。

デフォルト NOPAD
参照項目 LRECL=オプション

PRINT | NOPRINT

入力ファイルにキャリッジコントロール文字が含まれているかどうかを指定します。

ヒント キャリッジコントロール文字を削除する必要なしにDATAステップでファイルを読み込む場合は、PRINTを指定します。キャリッジコントロール文字をデータ値として読み込む場合は、NOPRINTを指定します。

RECFM=record-format

入力ファイルのレコード形式を指定します。

操作 SAS 9.4では、グローバルLRECLシステムオプションのデフォルト値は32767です。固定長レコード(RECFM=F)を使用する場合、LRECL=のデフォルト値は256になります。
動作環境 record-formatの値は動作環境によって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。

SCANOVER

INPUTステートメントが、@'character-string'式に指定された文字列を検出するまで、入力データレコードをスキャンするようにします。

操作 MISSOVER、TRUNCOVER、およびSTOPOVERオプションを使用すると、INPUTステートメントが@'character-string'式をスキャンしてレコードの終端に到達した場合に、そのINPUTステートメントがどのように動作するかを変更できます。デフォルト(FLOWOVERオプション)では、INPUTステートメントは次のレコードをスキャンします。それ以外のオプションでは、INPUTステートメントはスキャンを中止します。
ヒント SCANOVERとFLOWOVERの両方を指定することは冗長です。
参照項目 行の終わりを超えて読み込むFLOWOVERMISSOVERSTOPOVERTRUNCOVER
指定の文字列の直後に記述された可変長レコードをスキャンする

SHAREBUFFERS

FILEステートメントとINFILEステートメントが同じバッファを共有することを指定します。

別名 SHAREBUFS
ヒント INFILE、FILE、PUTステートメントでSHAREBUFFERSオプションを使用すると、外部ファイルを直接更新できます。外部ファイルを直接更新すると、PUTステートメント出力が出力バッファを経由せずに入力バッファから外部ファイルへと直接書き込まれるため、CPU時間を節約できます。
また、SHAREBUFFERSを使用すると、レコード全体ではなく、外部ファイル内の特定のフィールドを更新できます。
外部ファイルの更新
注意:
SHAREBUFFERS、RECFM=V、_INFILE_を使用する際、同一の長さのレコードを読み込んだ後、異なる長さのレコードを含むファイルを更新する場合には注意が必要です。
レコードの長さを変更するには、_INFILE_を使用します。この潜在的な問題を回避する方法の1つとして、元々のレコード長が維持されるように_INFILE_を追加または削除することが考えられます。

START=variable

変数名を指定します。この変数の値は、PUT _INFILE_ステートメントが書き込むレコードの最初の列番号として使用されます。自動変数と同じように、START=に指定した変数はデータセットに書き込まれません。

参照項目 PUTステートメントの_INFILE_オプション

STOPOVER

INPUTステートメントで、ステートメント内のすべての変数に対する値が見つからずに現在のレコードの終わりに達した場合、DATAステップの処理が停止します。期待された数の値が入力行に含まれていない場合、STOPステートメントが実行されないならば、SASは_ERROR_に値1を設定してデータセットの作成を中止し、不完全なデータ行を出力します。

ヒント デフォルトの動作に戻すにはFLOWOVERを使用します。
参照項目 行の終わりを超えて読み込むFLOWOVERMISSOVERSCANOVERTRUNCOVER
欠損値と短いレコードをリスト入力で処理する

TRUNCOVER

入力データレコードの長さがINPUTステートメントの期待する長さよりも短い場合のINPUTステートメントのデフォルトの動作を無効化します。デフォルトでは、INPUTステートメントは次の入力データレコードを自動的に読み込みます。TRUNCOVERを指定すると、INPUTステートメントの期待する長さよりも短いレコードが存在する場合、可変長のレコードを読み込むことができます。値を割り当てられていない変数には、欠損値が設定されます。

ヒント TRUNCOVERを使用すると、フィールドの長さが期待された長さより短い場合、入力バッファの内容を変数に割り当てることができます。
参照項目 行の終わりを超えて読み込むFLOWOVERMISSOVERSCANOVERSTOPOVER
指定の文字列の直後に記述された可変長レコードをスキャンする

UNBUFFERED

バッファリングされた(先行)読み込みを実施しないよう指示します。

別名 UNBUF
操作 UNBUFFEREDを指定すると、SASはEND=変数に値1を設定しなくなります。
ヒント DATALINESステートメントを使用して入力ストリームデータを読み込む場合、UNBUFFEREDが有効となります。

_INFILE_=variable

このINFILEステートメントの現在の入力バッファの内容を参照する文字変数を指定します。この変数は他の変数と同じように使用できます。また、値を割り当てることもできます。この変数の値は自動的に保持されます。初期値はブランクです。自動変数と同じように、_INFILE_=に指定した変数はデータセットに書き込まれません。

制限事項 variableには、すでに定義済みの変数は指定できません。_INFILE_=オプションには、そのDATAステップ内で初めて使用する変数を指定する必要があります。LENGTHステートメントやATTRIBステートメントを使用して、_INFILE_=に指定した変数の長さを設定したり変更することはできません。ただし、ATTRIBステートメントやFORMATステートメントを使用して、この変数に出力形式を指定することができます。
操作 この文字変数の最大長は、指定したINFILEステートメントの論理レコード長(LRECL=)になります。ただし、プログラムの実行直前まで、SASがこのファイルを開いてLRECL=オプションの値を確認することはありません。そのため、コンパイル実行中は、この変数のサイズは32,767バイトになります。
ヒント この変数の内容に対する変更は、INFILEステートメントの現在の入力バッファの内容にただちに反映されます。バッファの変更後に、そのINFILEステートメントが有効なスコープでPUT _INFILE_ステートメントを実行すると、変更されたバッファの内容が反映されます。N=オプションで複数のバッファを指定した場合でも、_INFILE_=に指定した変数は、指定したINFILEステートメントの現在の入力バッファにのみアクセスできます。
別のステートメントで_INFILE_=オプションを使用せずに入力バッファの内容にアクセスするには、自動変数_INFILE_を使用します。
_INFILE_変数は固定長ではありません。_INFILE_変数に値を割り当てると、その変数の長さは、割り当てられた値の長さへと変更されます。
参照項目 入力バッファのコンテンツへのアクセス
入力バッファ内のレコードを操作する

複数のファイルの入力バッファへのアクセス

動作環境オプション

options | host-options

動作環境の情報: INFILEステートメントでの動作環境固有のオプションの詳細については、各動作環境向けのSASドキュメントを参照してください。
参照項目 INFILEステートメントXisError: No pubcode in link data found for hostwinXisError: No pubcode in link data found for hostunx、およびXisError: No pubcode in link data found for hosto390

DBMS仕様

DBMS-Specifications

一部のDBMSファイルからレコードを読み込めるようにします。DBMSファイルからデータを読み込めるようにするには、SAS/ACCESSソフトウェアが必要です。詳細については、使用しているDBMSに対応するSAS/ACCESSドキュメントを参照してください。

詳細

INFILEステートメントの使用

INFILEステートメントは読み込み対象となるファイルを指定するものであるため、入力データレコードを読み込むINPUTステートメントよりも前に実行する必要があります。INFILEステートメントは実行ステートメントであるため、IF-THENステートメントのような条件付き処理でINFILEステートメントを使用できます。INFILEステートメントを使用すると、入力データレコードのソースを制御できます。
通常、INFILEステートメントは、外部ファイルからデータを読み込む場合に使用します。データをジョブストリームから読み込む場合、DATALINESステートメントを使用する必要があります。ただし、INFILEステートメントでのみ使用可能なデータ読み込みオプションを使用する場合、同じDATAステップ内で、DATALINESおよびDATALINESステートメントのファイル指定を含むINFILEステートメントを使用できます。詳細については、長い入力ストリームデータレコードの読み込みを参照してください。
複数のINFILEステートメントを使用して同じファイル指定を行い、各INFILEステートメントでオプションを使用した場合、それらのオプションが追加されます。混乱を避けるために、特定の外部ファイルに関するオプションはすべて最初のINFILEステートメントで指定するようにしてください。

複数の入力ファイルの読み込み

DATAステップの1回の反復で複数の入力ファイルから読み込みを行うには、次の2つの方法のうちどちらかを使用します。
  • 複数のファイルを開いた状態に保ち、読込先のファイルを変更し、複数のINFILEステートメントを使用する
  • 単一のDATAステップ内で現在の入力ファイルを動的に変更し、INFILEステートメントでFILEVAR=オプションを使用するFILEVAR=オプションを使用すると、1つのファイルから読み込みを行い、そのファイルを閉じた後、別のファイルを開くことができます。複数の入力ファイルからの読み込みを参照してください。

外部ファイルの直接更新

INFILEステートメントとFILEステートメントを組み合わせて使用することで、外部ファイルに含まれているレコードを更新できます。これを行うには次のようにします。
  1. FILEステートメントの前にINFILEステートメントを指定します。
  2. 各ステートメントで、同一のファイル参照名または物理ファイル名を指定します。
  3. FILEステートメントのかわりに、INFILEステートメントに、FILEステートメントとINFILEステートメントの両方で使用できるオプションを使用します。(これらのオプションをFILEステートメントに指定しても無視されます。)
外部ファイルの更新を参照してください。
レコード全体ではなく、レコード内の個々のフィールドを更新する方法については、SHAREBUFFERSオプションを参照してください。

入力バッファのコンテンツへのアクセス

_INFILE_=変数を使用する以外に、_INFILE_自動変数を使用することでも、最後に実行したINFILEステートメントの入力バッファの内容を参照できます。この文字変数の値は自動的に保持されます。初期値はブランクです。他の自動変数と同じように、_INFILE_はデータセットに書き込まれません。
INFILEステートメントで_INFILE_=オプションを指定すると、この変数の値を自動変数_INFILE_でも間接的に参照できます。自動変数_INFILE_が存在する場合に、特定のINFILEステートメントで_INFILE_を省略すると、そのINFILEステートメント用の内部的な_INFILE_変数が作成されます。これ以外の場合に、特定のFILEに対して_INFILE_変数が作成されることはありません。
実行時または参照時に、この文字変数の最大長は、現在の_INFILE_変数の最大長と一致します。ただし、_INFILE_が参照している他の変数の長さは実行時まで確定されないので、_INFILE_の長さはコンパイル時に32,767バイトに設定されます。たとえば、_INFILE_を長さが定義されていない新しい変数に割り当てる場合、新しい変数のデフォルトの長さは32,767バイトになります。LENGTHステートメントやATTRIBステートメントを使用して、_INFILE_の長さを設定または無効化することはできません。ただし、FORMATステートメントやATTRIBステートメントを使用すると、_INFILE_に出力形式を割り当てることができます。
他のSAS変数と同じように、割り当てステートメントを使用して、_INFILE_変数を更新することができます。また、PUTステートメントの_INFILE_でも出力形式を使用できます。たとえば、次のPUTステートメントでは、16進数の出力形式を使用して入力バッファの内容を出力します。
put _infile_ $hex100.;
_INFILE_に変更を加えると、現在のINFILEステートメントの入力バッファにただちに変更が反映されます。バッファの内容を変更した後、PUT _INFILE_ステートメントを実行すると、変更したバッファの内容が出力されます。
N=オプションに複数のバッファを指定した場合でも、_INFILE_は、そのINFILEステートメントで現在使用中の入力バッファの内容にのみアクセスします。N=に指定したすべてのバッファにアクセスできますが、特定のバッファを現在の入力バッファに設定するには、INPUTステートメントに#行ポインタコントロールを指定する必要があります。

区切り文字で区切られたデータ値の読み込み

デフォルトでは、リスト入力での入力データレコードの読み込みに使用される区切り文字は、1つのブランクになります。DSD (delimiter-sensitive data)オプション、DELIMITER=オプション、DLMSTR=オプション、DLMSOPT=オプションは、リスト入力での区切り文字の取り扱い方法に影響を与えます。DELIMITER=またはDLMSTR=オプションは、INPUTステートメントで、リスト入力により読み取られるデータ値の区切り文字として、ブランク以外の文字を使用することを指定します。DSDオプションを有効にすると、INPUTステートメントではデフォルトの区切り文字としてカンマを使用します。
また、DSDオプションを指定すると、2つの連続する区切り文字が欠損値として読み込まれるようになります。デフォルトでは、INPUTステートメントは、連続する区切り文字を1つの単位として扱います。DSDオプションを指定すると、INPUTステートメントは、連続する区切り文字をそれぞれ独立したものとして扱うようになります。このため、2つの連続する区切り文字で囲まれた空の文字列は欠損値として読み込まれます。区切り文字をカンマから別の値へと変更する場合、DELIMITER=またはDLMSTR=オプションを使用します。
たとえば、次のDATAステッププログラムでは、リスト入力を使用して、カンマで区切られたデータを読み込みます。2番目のデータ行には欠損値が含まれています。SASでは、リスト入力での連続する区切り文字の使用を許可しているため、このINPUTステートメントでは欠損値を検出できません。
data scores;
   infile datalines delimiter=',';
   input test1 test2 test3;
   datalines;
91,87,95
97,,92
,1,1
;
FLOWOVERオプションが有効である場合、データセットSCORESには、3つではなく2つのオブザベーションが含まれます。2番目のオブザベーションは正しく作成されません。
OBS
TEST1
TEST2
TEST3
1
91
87
95
2
97
92
1
この問題を修正するには、INFILEステートメントでDSDオプションを使用する必要があります。
data scores;
   input test1 test2 test3;
   datalines;
91,87,95
97,,92
,1,1
;
   infile datalines dsd;
今回のINPUTステートメントでは、2つの連続する区切り文字を検出するため、2番目のオブザベーションに含まれている変数TEST2には欠損値が割り当てられます。
OBS
TEST1
TEST2
TEST3
1
91
87
95
2
97
.
92
3
.
1
1
また、DSDオプションを指定すると、リスト入力で、引用符で囲まれた文字列内に区切り文字を含む文字値を読み込むことができるようになります。たとえば、データがカンマで区切られている場合、DSDオプションを指定すると、そのような文字列を引用符で囲むことで、同文字列に含まれているカンマを有効な文字として読む込むことができます。この場合の引用符は、文字値の一部としては保存されません。引用符を文字値の一部として保持するには、INPUTステートメントでチルダ(~)フォーマット修飾子を使用します。区切り文字の扱い方の変更を参照してください。
注: テキストファイルがローカルのエンコーディング環境以外の場所で作成された場合、EBCDIC環境またはASCII環境のどちらかでENCODING=オプションを指定する必要があります。たとえば、ASCIIプラットフォーム上でEBCDICファイルを読み込む場合、INFILEステートメントにENCODING=オプションを指定することをお勧めします。ただし、INFILEステートメントでDSDオプションおよびDLMオプションを使用する場合は、ENCODING=オプションを指定する必要があります。これは、2つのオプションがセッションエンコーディングの特定の文字(引用符、カンマ、ブランクなど)を必要とするためです。エンコーディング固有の入力形式は、対応するバイナリファイルと組み合わせて使用する必要があります。このようなバイナリファイルには、文字フィールドと文字以外のフィールドが含まれています。
デフォルト長よりも大きい長さのデータを扱う場合、入力形式を指定する必要があります。たとえば、日付または時間値、名前、住所などは、8文字よりも長い場合があります。そのような場合、INFORMATステートメントをDATAステップに追加するか、または入力形式をINPUTステートメントに直接追加します。INPUTステートメントに入力形式を追加する場合、その入力形式の前にコロン(:)を追加する必要があります。これにより、現在の区切り文字の後の最初の文字から、この入力形式内に指定された文字数までが読み込まれるようになります。
data a;
   infile 'c:\sas\example.csv' dlm='09'x dsd truncover;
   input fname :$20. lname :$30. address1 :$50. address2 :$50. city :$40.
         state :$2. zip phone :$12.;
run;
区切り文字で区切られたデータを読み込む場合に考慮すべきその他のINFILEオプションを次に示します。
FIRSTOBS=
最初に読み込むオブザベーションの番号を指定します。たとえば、ヘッダーレコードをスキップする場合には、FIRSTOBS=2と指定します。
TERMSTR=
行末文字を指定する場合に使用します。このオプションは、あるオペレーティングシステムで作成されたデータを、別のオペレーティングシステムと共有する場合に使用すると便利です。たとえば、UNIX環境で作業している場合に、Windows環境で作成されたファイルを読み込む必要があるならば、TERMSTR=CRLFと指定します。同様に、Windows環境で作業している場合に、UNIX環境で作成されたファイルを読み込む必要があるならば、TERMSTR=LFと指定します。
TRUNCOVER=
現在のレコード内にある使用可能な入力データのみを使用して、できるだけ多くの変数を割り当てるよう指定します。デフォルトでは、INPUTステートメントが、リストされている変数に割り当てる十分な数のデータを見つけられずにレコードの終端を超えて読み込む場合、同ステートメントは次のレコードからデータを継続して読み込みます。次のレコードを読み込まないようにするには、TRUNCOVER=オプションを使用します。
トラブルシューティングの例をいくつか次に示します。
問題
解決策
SASログに次のようなメッセージが出力されており、データセット内のすべてのデータが読み込み用に表示されています。One or more lines were truncated.
多くの場合、これは問題にはなりません。
このメッセージは、次のいずれかの条件が真である場合に表示されます。
  1. 最大レコード長が有効な論理レコード長よりも短い。
  2. すべてのデータがデータセット内にある。
  3. FIRSTOBS=オプションに1より大きい値を設定している。
このメッセージは、行の長さがLRECL=の値よりも大きいために、FIRSTOBS=オプションによりその行がスキップされたことを意味します。SASは、行の長さがLRECL=の値よりも大きいことを認識しますが、FIRSTOBS=オプションによりその行がスキップされたことは認識しません。
最後の変数が数値変数であり、すべてのオブザベーションで、この変数が欠損値となっています。
変数が欠損値となるよくある原因としては、UNIX環境でWindowsファイルを読み込んだことが挙げられます。UNIX環境では、改行文字としてラインフィード(LF)のみを使用します。UNIXオペレーティングシステムは、キャリッジリターン(CR)をデータとして読み込みます。しかし、CRは数値データではないため、無効なデータであるとのメッセージが生成されます。
INFILEステートメントでTERMSTR=CRLFオプションを指定します。
SAS 9よりも前のリリースを使用している場合、ファイルを適切なUNIX構造に変換するか、またはキャリッジリターン(<CR>)を区切り文字のリストに追加します。
CSVファイルを読み込む場合、キャリッジリターンをDL DLM='2C0D’xとして指定します。
タブで区切られたファイルを読み込む場合、DLM=’090D’xを使用します。
これら以外の区切り文字を使用している場合、SASテクニカルサポートに連絡してください。
CSVファイルを読み込むと、引用符で囲まれた文字列の内部でレコードが分割されます。たとえば、長いコメントフィールドが、読み込み中のファイル内の行の途中でいきなり中断され、残りの部分は次の行に続いている箇所があります。ファイルをテキストエディタで開くと、このことを確認できます。
この問題は、Microsoft Excelワークシートからファイルを作成した場合によく発生します。Excelでは、フォーマッティングを支援するために、列にソフトリターンが含まれています。ワークシートをCSVファイルとして保存すると、SASは、このソフトリターンを誤ってレコード終端マーカーとして解釈します。この結果、レコードが不正に分割されることになります。
SAS 9以降を使用する場合、Windows環境で、INFILEステートメントにTERMSTR=CRLFオプションを指定します。この設定は、SASが完全なリターンとラインフィードのみをレコード終端マーカーとして受け付けるよう指示します。
SAS 9よりも前のリリースを使用している場合、次のプログラムを実行します。このプログラムは、二重引用符で囲まれているラインフィード文字を空白へと変換し、SASがファイルを正しく読み込めるようにします。このプログラムでは、INFILEステートメントとFILEステートメントで同じファイルを参照しています。SHAREBUFFERSオプションを指定することにより、外部ファイルを直接更新して、問題のある文字を削除できるようにしています。
data _null_;
   infile 'c:\_today\mike.csf' recfm=n sharebuffers;
   file 'c:\_today\mike.csv' recfm=n;
   input a $char1.;
   retain open 0;
/* toggle the open flag */
   if a='"' then open=not open;
   if a='0A'x and open then put ' ';
run;
このプログラムは、ファイルを1バイトずつ読み込み、必要ならばラインフィード文字を置き換えます。

長い入力ストリームデータレコードの読み込み

INFILEステートメントとDATALINESファイル指定を組み合わせて使用することで、入力ストリームデータを処理できます。INPUTステートメントは、DATALINESステートメントの後に記述されたデータレコードを読み込みます。CARDIMAGEシステムオプションを指定した場合、またはこのオプションがお使いのシステムでデフォルトとなっている場合、ブランクが埋め込まれた80バイトのパンチカードイメージのようにデータ行が処理されます。INFILEステートメントではデフォルトでFLOWOVERオプションが使用されるため、INPUTステートメントは、同ステートメントに含まれているすべての変数用の値を現在のレコード内で検出できない場合、次のレコードを読み込みます。データが正しく処理されることを保証するには、レコード長が80バイトを超える場合の入力では外部ファイルを使用します。
注: NOCARDIMAGEシステムオプション(XisError: No pubcode in link data found for lesysoptsrefを参照)は、データ行を80バイトのカードイメージとして扱わないよう指定します。データ行の終端は、引用符で囲まれた文字列の場合を除いて、常に最後のトークンの終端として扱われます。

行の終わりを超えて読み込む

デフォルトでは、INPUTステートメントが現在の入力データレコードの終端を超えて読み込もうとする場合、同ステートメントは入力ポインタを次のレコードの列1に移動してから、残りの値を読み込みます。このデフォルトの動作は、FLOWOVERオプションにより指定されます。この結果、次のメッセージがSASログに書き込まれます。
NOTE: SAS went to a new line when INPUT
statement reached past the end of a line.
行の終端に到達した場合のINPUTステートメントの動作を変更する方法として、複数のオプションを使用できます。STOPOVERオプションを指定すると、この状態をエラーと判断し、データセットの作成を終了します。MISSOVERおよびTRUNCOVERオプションを指定すると、現在のINPUTステートメントが満たされない場合でも、入力ポインタが次の行へと移動しなくなります。SCANOVERオプションを@'character-string'とともに使用すると、指定したcharacter-stringが検出されるまで入力レコードがスキャンされます。デフォルトの動作に戻すにはFLOWOVERオプションを使用します。
TRUNCOVERとMISSOVERは類似したオプションです。MISSOVERオプションを指定すると、INPUTステートメントは、同ステートメント内で指定されたフィールド長よりも値の長さが小さいためにフィールド全体を読み込めない場合、その値を欠損値に設定します。TRUNCOVERオプションを指定すると、対応する変数に読み込まれた文字が書き込まれます。
たとえば、可変長レコードを含む外部ファイルに次のレコードが含まれているとします。
----+----1----+----2
1
22
333
4444
55555
次のDATAステップは、このデータを読み込み、SASデータセットを作成します。これらの入力レコードのうち、変数TESTNUMの長さ(入力形式でフォーマットされたもの)と同じ長さのレコードは1つだけです。
data numbers;
   infile 'external-file';
   input testnum 5.;
run;
デフォルトでは入力レコードの読み込み時にFLOWOVERオプションが使用されるため、このDATAステップは、5つの入力レコードから3つのオブザベーションを作成します。
INFILEステートメントでMISSOVERオプションを指定すると、このDATAステップは5つのオブザベーションを作成します。短すぎるレコードから読み込まれた値はすべて欠損値に設定されます。短すぎるために現在のINPUTステートメントを満たすことができないレコード内にどんな値が含まれているかを確認したい場合は、INFILEステートメントでTRUNCOVERオプションを指定します。
infile 'external-file' truncover;
この場合、DATAステップは、同じ入力レコードを読み込み、5つのオブザベーションを作成します。作成されたSASデータセットを比較した表を次に示します。
INFILEステートメントで異なるオプションを使用した場合のTESTNUMの値
OBS
FLOWOVER
MISSOVER
TRUNCOVER
1
22
.
1
2
4444
.
22
3
55555
.
333
4
.
4444
5
55555
55555

比較

  • INFILEステートメントでは、DATAステップのINPUTステートメントに対して入力ファイルが指定されます。FILEステートメントでは、DATAステップのPUTステートメントに対して出力ファイルが指定されます。
  • 通常、INFILEステートメントは、外部ファイルからデータを読み込む場合に使用します。DATALINESステートメントは、ジョブストリーム内の同ステートメントの後にデータが続くことを指定します。INFILEステートメントとDATALINESファイル指定を組み合わせて使用すると、INPUTステートメントが入力ストリームデータを読み込む方法に影響を与える特定のデータ読み込みオプションを利用できるようになります。

例1: 区切り文字の扱い方の変更

デフォルトでは、INPUTステートメントはブランクを区切り文字として使用します。次のデータステップでは、カンマを区切り文字として使用します。
data num;
   infile datalines dsd;
   input x y z;
   datalines;
,2,3
4,5,6
7,8,9
;
INFILEステートメントのDATALINES引数を指定すると、入力ストリームデータ行を読み込むためのINFILEステートメントオプションを使用できるようになります。DSDオプションを指定すると、カンマがデフォルトの区切り文字に設定されます。最初のデータ行の先頭にある値の前にカンマが記述されているため、1番目のオブザベーション内の変数Xには欠損値が割り当てられ、変数Yには値2が割り当てられます。
データで複数の区切り文字を使用している場合や、カンマ以外の単一区切り文字を使用している場合、DELIMITER=オプションを使用してその区切り文字値を指定します。次の例では、文字aおよびbが区切り文字として使用されています。
data nums;
    infile datalines dsd delimiter='ab';
    input X Y Z;
    datalines;
1aa2ab3
4b5bab6
7a8b9
;

proc print; run;
実行後に作成されたNUMデータセットをPROC PRINTで出力した結果を次に示します。DSDオプションを指定すると、リスト入力は2つの連続する区切り文字を検出できるようになります。このため、1番目と2番目のオブザベーション内の変数には欠損値が割り当てられます。DSDオプションを省略すると、文字a、b、aa、ab、ba、bbが区切り文字として使用されるため、変数には欠損値が割り当てられません。
NUMデータセット
NUMデータセット
文字列を区切り文字として使用するには、DLMSTR=オプションで区切り文字値を指定します。次の例では、文字列PRDを区切り文字として使用します。この文字列にはすべて大文字が含まれていることに注意してください。DLMSOPT=オプションを使用することで、PRDPrdPRdPrDpRdpRDprDprdをすべて有効な区切り文字にしています。
data test;
    infile datalines dsd dlmstr='PRD' dlmsopt='i';
    input X Y Z;
    datalines;
1PRD2PRd3
4PrD5Prd6
7pRd8pRD9
;
 proc print data=test; run;
PROC PRINTによる出力は、TESTデータセット内のすべてのオブザベーションを表示します。
TESTデータセット
TESTデータセット
次のDATAステップでは、修飾リスト入力とDSDオプションを使用して、カンマで区切られたデータや、文字値の一部としてカンマを含んでいる可能性のあるデータを読み込みます。
data scores;
   infile datalines dsd;
   input Name : $9. Score
         Team  : $25. Div $;
   datalines;
Joseph,76,"Red Racers, Washington",AAA
Mitchel,82,"Blue Bunnies, Richmond",AAA
Sue Ellen,74,"Green Gazelles, Atlanta",AA
;

proc print; run;
実行後に作成されたSCORESデータセットをPROC PRINTで出力した結果を次に示します。区切り文字(カンマ)は、変数TEAMの値の一部として格納されます。一方、引用符はそのような値としては格納されません。
SCORESデータセット
SCORESデータセット

例2: 欠損値と短いレコードをリスト入力で処理する

次の例では、リスト入力を使用してデータを読み込む場合に、欠損値を原因とする問題の発生を防ぐ方法を示します。この例の最初のデータ行には、5つの値ではなく、3つの値だけが含まれています。MISSOVERオプションを指定すると、最初のデータ行の4番目と5番目の値は欠損値に設定されます。
data weather;
   infile datalines missover;
   input temp1-temp5;
   datalines;
97.9 98.1 98.3
98.6 99.2 99.1 98.5 97.5
96.2 97.3 98.3 97.6 96.5
;
SASは、最初のデータ行に含まれている3つの値を、TEMP1、TEMP2、TEMP3の値として読み込みます。MISSOVERオプションを指定すると、最初のオブザベーション内の変数TEMP4およびTEMP5の値が欠損値に設定されます。これらの変数用の値が、現在の入力データレコード内には提供されていないためです。
MISSOVERオプションを省略するか、またはFLOWOVERオプションを指定すると、SASは入力ポインタを2番目のデータ行に移動し、変数TEMP4およびTEMP5の値をその行から読み込みます。DATAステップの次の実行では、新しい行として、3番目の行が読み込まれます。SASログには次のメッセージが表示されます。
NOTE: SAS went to a new line when INPUT statement
      reached past the end of a line.
INFILEステートメントではSTOPOVERオプションも使用できます。STOPOVERオプションを使用すると、INPUTステートメントが生データのレコード内に十分な値を検出できない場合には、DATAステップが実行を停止するようになります。
 infile datalines stopover;
最初のデータレコードではTEMP4の値が見つからないため、SASは_ERROR_に値1を設定した後、データセットの作成を中止し、データ行1を出力します。

例3: 指定の文字列の直後に記述された可変長レコードをスキャンする

次の例では、TRUNCOVERオプションとSCANOVERオプションを組み合わせて使用することにより、電話帳から電話番号を取り出します。電話番号の前には、必ず“phone:”という文字列が記述されているものとします。電話番号は国際番号形式であるため、最大長は32文字になります。
filename phonebk host-specific-path;
data _null_;
  file phonebk;
  input line $80.;
  put line;
  datalines;
    Jenny's Phone Book
    Jim Johanson phone: 619-555-9340
       Jim wants a scarf for the holidays.
    Jane Jovalley phone: (213) 555-4820
       Jane started growing cabbage in her garden.
       Her dog's name is Juniper.
    J.R. Hauptman phone: (49)12 34-56 78-90
       J.R. is my brother.
   ;
run;
@'phone:'を使用すると、電話番号を含むファイルの行をスキャンし、電話番号が始まる位置にファイルポインタを移動できます。また、TRUNCOVERオプションとSCANOVERオプションを組み合わせて使用することで、文字列'phone:'を含んでいない行をスキップし、電話番号のみをログに書き込めます。
data _null_;
   infile phonebk truncover scanover;
   input @'phone:' phone $32.;
   put phone=;
run;
このプログラムを実行すると、次の行がSASログに出力されます。
phone=619-555-9340 phone=(213) 555-4820 phone=(49)12 34-56 78-90

例4: 可変長レコードを含むファイルの読み込み

次の例では、LENGTH=オプションと$VARYING.入力形式を組み合わせて使用することで、可変長レコードを含むファイルを読み込んでいます。
data a;
   infile file-specification length=linelen lrecl=510 pad; 
   input firstvar 1-10 @;  /* assign LINELEN   */
   varlen=linelen-10;      /* Calculate VARLEN */
   input @11 secondvar $varying500. varlen;
run;
このDATAステップでは次のことが行われます。
  • INFILEステートメントでは、変数LINELENを作成しますが、この変数には値を割り当てません。
  • 最初のINPUTステートメントを実行すると、SASはレコード行の長さを判定し、変数LINELENに値を割り当てます。後置@が指定されているため、次のINPUTステートメントの入力バッファにレコードが保持されます。
  • 割り当てステートメントでは、2つの既知の長さ(FIRSTVARの長さとレコード全体の長さ)を使用して、VARLENの長さを決定します。
  • 2番目のINPUTステートメントでは、$VARYING500.入力形式付きのVARLEN値を使用して、変数SECONDVARの値を読み込みます。
詳細については、XisError: No pubcode in link data found for leforinforrefを参照してください。

例5: 複数の入力ファイルからの読み込み

次のDATAステップでは、DATAステップの反復ごとに、2つの入力ファイルから読み込みます。SASが1つのファイルから別のファイルへと処理を切り替える際に、各ファイルは開かれたままになります。入力ポインタは、現在の位置のまま移動しないため、次回INPUTステートメントを実行すると、ファイルの読み込みがその位置から開始されます。
data qtrtot(drop=jansale febsale marsale aprsale maysale junsale);
     /* identify location of 1st file */
   infile file-specification-1;
     /* read values from 1st file     */
   input name $ jansale febsale marsale; 
   qtr1tot=sum(jansale,febsale,marsale);
     /* identify location of 2nd file */
   infile file-specification-2;
     /* read values from 2nd file     */
   input @7 aprsale maysale junsale;
   qtr2tot=sum(aprsale,maysale,junsale);
run;
SASが最小の入力ファイルの終端に到達すると、DATAステップは終了します。
次のDATAステップでは、FILEVAR=オプションを使用して、DATAステップの反復ごとにそれぞれ別のファイルを読み込みます。
data allsales;
   length fileloc myinfile $ 300;
   input fileloc $ ; /* read instream data       */
  /* The INFILE statement closes the current file 
     and opens a new one if FILELOC changes value 
     when INFILE executes                        */
   infile file-specification filevar=fileloc 
          filename=myinfile end=done; 
  /* DONE set to 1 when last input record read  */
   do while(not done);
  /* Read all input records from the currently  */
  /* opened input file, write to ALLSALES       */
     input name $ jansale febsale marsale;
     output;
   end;
   put 'Finished reading ' myinfile=; 
   datalines;
external-file-1
external-file-2
external-file-3
;
FILENAME=オプションは、現在の入力ファイルの名前を変数MYINFILEに割り当てます。LENGTHステートメントは、FILENAME=変数とFILEVAR=変数の長さが、このファイル名を値として格納するために十分であることを保証します。PUTステートメントは、現在開かれている入力ファイルの物理名をSASログに出力します。

例6: 外部ファイルの更新

次の例では、SHAREBUFFERSオプションを指定したINFILEステートメントと、INPUT、FILE、PUTステートメントを組み合わせて使用することで、外部ファイルを直接更新します。
data _null_;
     /* The INFILE and FILE statements     */
     /* must specify the same file.       */
   infile file-specification-1 sharebuffers;
   file file-specification-1;
   input state $ 1-2 phone $ 5-16; 
     /* Replace area code for NC exchanges */
   if state= 'NC' and substr(phone,5,3)='333' then
     phone='910-'||substr(phone,5,8);
   put phone 5-16;
run;

例7: コピーされたレコードの切り捨て

LENGTH=オプションは、PUT _INFILE_ステートメントを使用して、入力ファイルを別のファイルにコピーする場合に便利です。LENGTH=オプションを指定すると、コピーされレコードを切り捨てることができます。たとえば、次のステートメントでは、入力データレコードを出力ファイルに書き込む前に、各入力データレコードの末尾から20列を切り捨てます。
data _null_;
   infile  file-specification-1 length=a;
   input;
   a=a-20;
   file file-specification-2;
   put _infile_;
run;
PUT _INFILE_ステートメントでコピーした内容を切り捨てる場合、START=オプションを使用すると便利です。たとえば、各レコードの先頭から10列目までをコピーしたくない場合、次のステートメントを使用すると、入力バッファ内の各レコードの11列目から末尾までをコピーできます。
data _null_;
   infile file-specification start=s;
   input;
   s=11;
   file file-specification-2;
   put _infile_;
run;

例8: ポインタ位置の出力

次のDATAステップでは、入力バッファ内の現在のポインタの位置を表す値を、変数LINEPTおよびCOLUMNPTに割り当てます。
data _null_;
   infile datalines n=2 line=Linept col=Columnpt;
   input name $ 1-15 #2 @3 id;
   put linept= columnpt=;
   datalines;
J. Brooks
  40974
T. R. Ansen
  4032
;
これらのステートメントは、DATAステップを実行するたびに、次の行を出力します。これは、PUTステートメントの実行時には、入力ポインタが入力バッファ内の2番目の行に存在するためです。
Linept=2 Columnpt=9
Linept=2 Columnpt=8

例9: 入力バッファ内のレコードを操作する

_INFILE_変数には、常に、INPUTステートメントを通じて読み込まれた最後のレコードが含まれています。次の例では、_INFILE_変数を使用して、
  • INPUTステートメントを使用せずに解析したいレコード全体を読み込む方法を示します。
  • SASログに書き込みたいレコード全体を読み込みます。
  • この行がINPUTステートメントにより解析される前に、入力レコードの内容を変更します。
次の例では、電話料金情報を含むファイルを作成します。数値データ(minutesおよびcharge)は、山かっこ(< >)で囲んで指定します。
filename phonbill host-specific-filename;
data _null_;
   file phonbill;
   input line $80.;
   put line;
   datalines;
   City Number Minutes Charge
   Jackson 415-555-2384 <25> <2.45>
   Jefferson 813-555-2356 <15> <1.62>
   Joliet 913-555-3223 <65> <10.32>
   ;
run;
次のコードでは、各レコードを読み込み、レコードを解析することにより、minuteとchargeの値を取り出します。
data _null_;
   infile phonbill firstobs=2;
   input;
   city = scan(_infile_, 1, ' ');
   char_min = scan(_infile_, 3, ' ');
   char_min = substr(char_min, 2, length(char_min)-2);
   minutes = input(char_min, BEST12.);
   put city= minutes=;
run;
このプログラムを実行すると、次の行がSASログに出力されます。
city=Jackson minutes=25 city=Jefferson minutes=15 city=Joliet minutes=65
次に示すコード内のINPUTステートメントは、このファイルからレコードを読み込みます。_INFILE_自動変数をPUTステートメントで使用することにより、レコードをログに書き込んでいます。
data _null_;
   infile phonbill;
   input;
   put _infile_;
run;
このプログラムを実行すると、次の行がSASログに書き込まれます。
City Number Minutes Charge Jackson 415-555-2384 <25> <2.45> Jefferson 813-555-2356 <15> <1.62> Joliet 913-555-3223 <65> <10.32>
次のコードでは、最初のINPUTステートメントで、読み込んだレコードを入力バッファ内に保持します。_INFILE_=オプションにより、数値データから山かっこ(< >)を取り除きます。2番目のINPUTステートメントで、バッファ内の値を解析します。
data _null_;
   length city number $16. minutes charge 8;
   infile phonbill firstobs=2;
   input @;
   _infile_ = compress(_infile_, '<>');
   input city number minutes charge;
   put city= number= minutes= charge=;
run;
このプログラムを実行すると、次の行がSASログに書き込まれます。
city=Jackson number=415-555-2384 minutes=25 charge=2.45 city=Jefferson number=813-555-2356 minutes=15 charge=1.62 city=Joliet number=913-555-3223 minutes=65 charge=10.32

例10: 複数のファイルの入力バッファへのアクセス

次の例では、_INFILE_自動変数と_INFILE_=オプションの両者を使用して複数のファイルを読み込んだ後、それぞれの入力バッファにアクセスしています。次のプログラムを実行すると4つのファイルが作成されます。そのうちの3つはデータファイルであり、4つ目のファイルにはすべてのデータファイルの名前が含められます。2番目のDATAステップでは、このファイル名ファイルを読み込み、各データファイルを開き、その内容をログに書き込みます。PUTステートメントでは、ファイル名ファイルとデータファイル用に_INFILE_変数が必要となるため、_INFILE_変数の1つはfnameを使用して参照されます。
data _null_;
   do i = 1 to 3;
      fname= 'external-data-file' || put(i,1.) || '.dat';
      file datfiles filevar=fname;
      do j = 1 to 5;
         put i j;
      end;
      file 'external-filenames-file';
      put fname;
   end;
run;
data _null_;
   infile 'external-filenames-file' _infile_=fname;
   input;
   infile datfiles filevar=fname end=eof;
   do while(^eof);
      input;
      put fname _infile_;
   end;
run;
このプログラムを実行すると、次の行がSASログに出力されます。
NOTE:The infile 'external-filenames-file' is:File Name=external-filenames-file, RECFM=V, LRECL=256 NOTE:The infile DATFILES is:File Name=external-data-file1.dat, RECFM=V, LRECL=256 external-data-file1.dat 1 1 external-data-file1.dat 1 2 external-data-file1.dat 1 3 external-data-file1.dat 1 4 external-data-file1.dat 1 5 NOTE:The infile DATFILES is File Name=external-data-file2.dat, RECFM=V, LRECL=256 external-data-file2.dat 2 1 external-data-file2.dat 2 2 external-data-file2.dat 2 3 external-data-file2.dat 2 4 external-data-file2.dat 2 5 NOTE:The infile DATFILES is File Name=external-data-file3.dat, RECFM=V, LRECL=256 external-data-file3.dat 3 1 external-data-file3.dat 3 2 external-data-file3.dat 3 3 external-data-file3.dat 3 4 external-data-file3.dat 3 5

例11: 外部ファイル読み込み時のエンコードの指定

この例では、外部ファイルからSASデータセットを作成します。外部ファイルのエンコーディングはUTF-8であり、現在のSASセッションのエンコーディングはWlatin1です。デフォルトでは、SASは、外部ファイルのエンコーディングがセッションエンコーディングと同じであると見なします。このため、文字データは新しいSASデータセットに正しく書き込まれません。
外部ファイルの読み込み時に使用するエンコーディングを指定するには、ENCODING=オプションを指定します。外部ファイルのエンコーディングをUTF-8に指定すると、新しいSASデータセットへの書き込み時に、外部ファイルがUTF-8から現在のセッションエンコーディングにトランスコードされます。これで、新しいデータセットにデータがWlatin1のエンコーディングで正しく書き込まれるようになります。
libname myfiles 'SAS-library';
filename extfile 'external-file';
data myfiles.unicode;
   infile extfile encoding="utf-8";
   input Make $ Model $ Year;
run;

関連項目:

XisError: No pubcode in link data found for lrcon
ステートメント:
XisError: No pubcode in link data found for appmsgdg
XisError: No pubcode in link data found for appmsgdg
SAS Intelligence Platform:Application Server Administration GuideのLOCKDOWNステートメント
システムオプション:
SAS Intelligence Platform:Application Server Administration GuideのLOCKDOWNシステムオプション
前のページ|次のページ|ページの先頭へ