INPUTステートメントで読み込む外部ファイルを指定します。
該当要素: | DATAステップ |
カテゴリ: | ファイル操作 |
種類: | 実行 |
制限事項: | SASがロックダウン状態にある場合、ロックダウンパスリストに含まれていないファイルに関しては、INFILEステートメントを使用できません。詳細については、XisError: No pubcode in link data found for lrconを参照してください。 |
動作環境: | INFILEステートメントは、動作環境に固有のマテリアルを含んでいます。このステートメントを使用する前に、各動作環境向けのSASドキュメントを参照してください。 |
参照項目: | INFILEステートメントXisError: No pubcode in link data found for hostwin、XisError: No pubcode in link data found for hostunx、およびXisError: No pubcode in link data found for hosto390 |
入力データレコードのソースを指定します。これは外部ファイルまたは入力ストリームデータになります。File-specificationには、次の形式を指定できます。
外部ファイルの物理名を指定します。物理名とは、動作環境がそのファイルにアクセスするために使用する名前のことです。
外部ファイルのファイル参照名を指定します。
要件 | ファイル参照名は、FILENAMEステートメントまたはFILENAME関数を使用するか、適切な動作環境のコマンドを使用して、あらかじめ前のステップで外部ファイルに関連付けておく必要があります。 |
参照項目 | FILENAMEステートメント |
集約記憶域に関連付けられているファイル参照名の後に、その集約記憶域に含まれているファイルまたはメンバの名前を丸かっこで囲んで指定します。
要件 | 集約記憶域に格納されているファイルの名前が有効なSAS名ではない場合は、その名前を引用符で囲む必要があります。 |
ファイル参照名は、FILENAMEステートメントまたはFILENAME関数を使用するか、適切な動作環境のコマンドを使用して、あらかじめ前のステップで外部ファイルに関連付けておく必要があります。 | |
動作環境 | 複数のファイルをまとめて保存する集約記憶域の名前は、ディレクトリ、MACLIB、区分データセットなど、動作環境によって異なります。外部ファイルの指定方法の詳細については、各動作環境向けのSASドキュメントを参照してください。 |
参照項目 | FILENAMEステートメント |
定義については、DATALINESを参照してください。
別名 | DATALINES | DATALINES4 |
DATAステップ内のDATALINESまたはDATALINES4ステートメントの直後に入力データが続くことを指定します。DATALINESを指定すると、INFILEステートメントの各種オプションを使用して、INPUTステートメントが入力ストリームデータ行を読み込む方法を制御できます。
別名 | CARDS | CARDS4 |
例 | 区切り文字の扱い方の変更 |
ヒント | ERRORCHECKオプションがSTRICTに設定されている場合、SYSERRマクロ変数を使用すると、file-specificationの指定の有無を確認できます。 |
ファイル参照名が入力デバイスまたは出力デバイスを参照する場合や物理ファイルではない場所を参照する場合に使用する、デバイスタイプまたはアクセス方式を指定します。
このアクセス方式を指定すると、ActiveMQメッセージブローカーへアクセスできます。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | XisError: No pubcode in link data found for appmsgdg |
CATALOGアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | CATALOGアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、CATALOGアクセス方式を参照してください。 |
CLIPBOARDアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | CLIPBOARDアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、CLIPBOARDアクセス方式を参照してください。 |
デバイスがディスクドライブであると指定します。
ヒント | ディスク上のファイルにファイル参照名を割り当てる場合、DISKを指定する必要はありません。 |
ファイルへの出力を破棄するように指定します。
ヒント | テストを実行する場合はDUMMYを指定すると便利です。 |
FTPアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | FTPアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、FTPアクセス方式を参照してください。 |
例 | infile dummy ftp user='myuid' pass='xxxx' filevar=file_to_read; |
出力デバイスの種類がグラフィックデータを受信するグラフィックデバイスであると指定します。
Hadoopアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | Hadoopアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、Hadoopアクセス方式を参照してください。 |
Java Message Service (JMS) の送信先を指定します。
名前の付いていないパイプを指定します。
注 | 動作環境によっては、パイプがサポートされない場合があります。 |
バッファなしのグラフィック出力デバイスを指定します。
プリンタまたはプリンタスプールファイルを指定します。
SFTPアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | SFTPアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、SFTPアクセス方式を参照してください。 |
SOCKETアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | SOCKETアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、SOCKETアクセス方式を参照してください。 |
テープドライブを指定します。
ファイル名が割り当てられている間だけ存在する一時ファイルを作成します。この一時ファイルは論理名からのみアクセスできます。また、論理名が存在する間だけ使用できます。
制限事項 | 物理パス名は指定しないでください。物理パス名を指定するとエラーが発生します。 |
ヒント | TEMPデバイスで操作されるファイルは、同じ属性を持ち、DISKファイルと同様な動作ができます。 |
ユーザーの端末を指定します。
ユニバーサル印刷プリンタの定義名を指定します。
ヒント | FILENAMEステートメントにプリンタ名を指定しない場合、PRINTERPATHオプションによって、使用するユニバーサルプリンタと出力先が制御されます。 |
URLアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | URLアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、URLアクセス方式を参照してください。 |
WEBDAVアクセス方式を指定します。
操作 | DATAステップでアクセス方式のオプションを認識できない場合、DATAステップはこのオプションをアクセス方式に渡して処理します。 |
参照項目 | WEBDAVアクセス方式で指定可能なオプションの一覧については、FILENAMEステートメント、WebDAVアクセス方式を参照してください。 |
別名 | DEVICE=device-type |
デフォルト | DISK |
要件 | device-typeまたはDEVICE=device-typeは、ステートメントのfile-specificationの直後に記述する必要があります。 |
動作環境 | 指定するデバイスによっては、さらに情報を指定することが必要になる場合があります。DISK以外の値を指定する前に、各動作環境向けのSASドキュメントを参照してください。動作環境によっては、ここで説明した値の他に使用できる値が存在する場合があります。 |
入力ファイルのブロックサイズを指定します。
デフォルト | ご使用の動作環境によって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。 |
LIST入力でブランクのかわりに使用する区切り文字を指定します。使用できるdelimiter(s)は次のとおりです。
区切り文字として読み込む文字を1つまたは複数指定します。
要件 | 指定する区切り文字のリストは引用符で囲む必要があります。 |
例 | 区切り文字の扱い方の変更 |
文字変数の名前を指定します。指定した変数の値が区切り文字として使用されます。
別名 | DLM= |
デフォルト | ブランク |
ヒント | 区切り文字では大文字と小文字が区別されます。 |
一般的な区切り文字としては、カンマ(,)、縦棒(|)、セミコロン(;)、タブが挙げられます。タブは16進数の文字で指定します。UNIXおよびWindows環境では、タブの値は'09'xになります。z/OS環境では、タブの値は'05'xになります。 | |
参照項目 | 区切り文字で区切られたデータ値の読み込み、DLMSTR=、および DSD (delimiter-sensitive data) |
例 | 区切り文字の扱い方の変更 |
LIST入力でブランクのかわりに使用する区切り文字を指定します。使用できるdelimiterは次のとおりです。
区切り文字として読み込む文字列を指定します。
要件 | 文字列は一重引用符で囲みます。 |
例 | 区切り文字の扱い方の変更 |
文字変数の名前を指定します。指定した変数の値が区切り文字として使用されます。
デフォルト | ブランク |
操作 | INFILEステートメントにDLMSTR=オプションを複数指定すると、最後に指定したDLMSTR=オプションが使用されます。DELIMITER=オプションとDLMSTR=オプションの両方を指定すると、最後に指定したオプションが使用されます。 |
RECFM=Nを指定する場合は、サイズが大きい入力項目でも十分に保持できる値がLRECLに指定されていることを確認してください。指定した値が十分ではない場合、区切り文字によってレコード境界間で分割される場合があります。 | |
ヒント | 区切り文字では大文字と小文字が区別されます。区切り文字で大文字小文字を区別するには、DLMSOPT='I'オプションを使用します。 |
参照項目 | 区切り文字で区切られたデータ値の読み込み、DELIMITER=、DLMSOPT=、DSD |
例 | 区切り文字の扱い方の変更 |
DLMSTR=オプションの解析オプションを指定します。ここでは、option(s)は次の値のいずれかになります。
大文字小文字を区別せずに比較を行うことを指定します。
区切り文字の末尾にあるブランクを削除するよう指定します。
ヒント | Tオプションは、区切り文字として変数を使用する場合に便利です。 |
I、T、またはその両方を指定できます。 |
要件 | DLMSOPT=オプションは、DLMSTR=オプションを使用している場合にのみ有効です。 |
参照項目 | DLMSTR= |
例 | 区切り文字の扱い方の変更 |
データ値が引用符で囲まれている場合、そのデータ値内の区切り文字を文字データとして扱うことを指定します。DSDオプションを指定すると、LIST入力を使用する場合のSASによる区切り文字の扱い方を変更し、デフォルトの区切り文字をカンマに変更できます。DSDを指定すると、SASは2つの連続する区切り文字を欠損値として扱い、文字値から引用符を削除します。
操作 | 区切り文字を変更するには、DELIMITER=またはDLMSTR=オプションを使用します。 |
ヒント | 引用符に囲まれている文字列内に区切り文字を含んでいる文字値を読み込むには、DSDオプションとLIST入力を使用します。INPUTステートメントは、そのような区切り文字を有効な文字として扱い、その値を格納する前に、文字列から引用符を削除します。引用符を保持するには、チルダ(~)フォーマット修飾子を使用します。 |
参照項目 | 区切り文字で区切られたデータ値の読み込み、DELIMITER=、およびDLMSTR= |
例 | 区切り文字の扱い方の変更 |
外部ファイルからの読み取り時に使用するエンコーディングを指定します。ENCODING=の値は、外部ファイルのエンコーディングが現在のセッションエンコーディングとは異なることを示しています。
デフォルト | SASでは、外部ファイルのエンコーディングがセッションエンコーディングと同じであるとみなします。 |
参照項目 | 有効なエンコーディング値については、XisError: No pubcode in link data found for nlsrefを参照してください。 |
例 | 外部ファイル読み込み時のエンコードの指定 |
変数名を指定します。現在の入力データレコードが最後である場合、この変数に値1が設定されます。SASが最後のデータレコードを処理するまで、END=変数には値0が設定されます。自動変数と同じように、この変数はデータセットに書き込まれません。
制限事項 | END=オプションは、UNBUFFEREDオプションと一緒には使用できません。 また、複数の入力データレコードを読み込むDATALINES/DATALINES4ステートメントやINPUTステートメントでは使用できません。 |
ヒント | END=が無効である場合、オプションEOF=を使用します。 |
例 | 複数の入力ファイルからの読み込み |
ステートメントラベルを指定します。これは、INFILEステートメントがファイルの終わりに達した場合に明示的なGO TOのオブジェクトとなります。INPUTステートメントが、それ以上レコードを含んでいないファイルから読み込もうとする場合、このステートメントラベルに実行が移動されます。
操作 | UNBUFFEREDオプションと一緒に使用する場合や、複数の入力データレコードを読み込むDATALINES/DATALINES4ステートメントやINPUTステートメントと組み合わせて使用する場合、END=オプションのかわりにEOF=を使用します。 |
ヒント | EOF=オプションは、複数の入力ファイルを順番に読み込む場合に便利です。 |
参照項目 | END=、EOV=、およびUNBUFFERED |
タブ文字を標準タブ設定に拡張するかどうかを指定します。EXPANDTABSを指定すると、タブ文字が、列9から始まる8列の間隔に設定されます。
デフォルト | NOEXPANDTABS |
ヒント | EXPANDTABSオプションは、お使いの動作環境にネイティブなタブ文字を含むデータを読み込む場合に便利です。 |
変数名を指定します。この変数には、現在開かれている入力ファイルの物理名が設定されます。一連の連結ファイルでは、この変数は、SASが次のファイルを検出した場合にのみ更新されます。自動変数と同じように、FILENAME=に指定した変数はデータセットに書き込まれません。
ヒント | LENGTHステートメントを使用すると、物理ファイル名を格納できる長さにまで変数の長さを拡張できます。 |
参照項目 | FILEVAR= |
例 | 複数の入力ファイルからの読み込み |
変数名を指定します。この変数の値が変化すると、INFILEステートメントは現在の入力ファイルを閉じ、新しいファイルを開きます。次のINPUTステートメントが実行されると、FILEVAR=変数に指定された新しいファイルから読み込みが実施されます。自動変数と同じように、この変数はデータセットに書き込まれません。
制限事項 | FILEVAR=変数には、物理ファイル名を表す文字列を指定する必要があります。 |
操作 | FILEVAR=オプションを使用すると、file-specificationは、実際のファイル名またはファイルに対して事前に割り当てられたファイル参照名ではなく、プレースホルダになります。このプレースホルダを使用して、処理情報をSASログに出力します。プレースホルダには、ファイル参照名と同じルールが適用されます。 |
ヒント | FILEVAR=オプションを使用すると、現在開かれている入力ファイルを新しい物理ファイルに動的に変更できます。 |
FILEVAR=オプションを使用する場合、現在開かれている入力ファイルが最後のファイルであるかどうかを知ることはできません。DATAステップがファイル終端マーカーまたはすべての開かれているデータセットの終わりに到達すると、シャットダウンが行われます。また、FILEVARをFIRSTOBSと併用すると、複数のファイルの中でヘッダーレコードのみを含むファイルによって、DATAステップの通常のシャットダウンがトリガされます。このシャットダウンは、ファイル終端指示子を超えて読み込みを行うとDATAステップが終了するために発生します。EOF=オプションを使用すると、シャットダウンを回避することができます。 | |
参照項目 | 外部ファイルの直接更新 |
例 | 複数の入力ファイルからの読み込み |
レコード番号を指定します。SASはこの番号を使用して、入力ファイル内の入力データレコードの読み込みを開始します。
デフォルト | 1 |
ヒント | FIRSTOBS=とOBS=を組み合わせて使用することで、ファイル内に含まれている特定の範囲のレコードを読み込むことができます。 |
ファイル内のヘッダーレコードをスキップするには、FIRSTOBS=2を使用します。 | |
例 | 次のステートメントでは、50番目から100番目までのレコードを処理します。 infile file-specification firstobs=50 obs=100; |
INPUTステートメントが、ステートメント内にあるすべての変数に関して、現在の入力行内に値を検出しなかった場合、次の入力データレコードを継続して読み込むようにします。FLOWOVERは、INPUTステートメントのデフォルトの動作です。
参照項目 | 行の終わりを超えて読み込む、MISSOVER、STOPOVER、TRUNCOVER |
変数名を指定します。この変数には、現在の入力ファイルの長さが設定されます。SASは、INPUTステートメントが実行されるまで、この変数に値を割り当てません。自動変数と同じように、LENGTH=変数はデータセットに書き込まれません。
ヒント | このオプションは、フィールド幅が異なる場合に、XisError: No pubcode in link data found for leforinforrefと組み合わせて使用すると便利です。 |
例 | 可変長レコードを含むファイルの読み込み |
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; |
論理レコード長を指定します。
デフォルト | 各動作環境のファイル特性により異なります。 |
制限事項 | DATALINESファイル指定を使用する場合、LRECLは無効となります。 |
操作 | かわりに、XisError: No pubcode in link data found for lesysoptsrefを使用すると、グローバルな論理レコード長を指定できます。グローバルLRECLシステムオプションのデフォルト値は32767です。固定長レコード(RECFM=F)を使用する場合、LRECLのデフォルト値は256になります。 |
動作環境 | logical-record-lengthの値は動作環境によって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。 |
ヒント | LRECL=オプションには、ファイルの物理的な行の長さを指定します。LINESIZE=オプションには、INPUTステートメントが読み込む行の長さを指定します。 |
INPUTステートメントが、ステートメント内にあるすべての変数に関して、現在の入力行内に値を検出しなかった場合、新しい入力データレコードを読み込まないようにします。INPUTステートメントが現在の入力データレコードの終端に到達すると、何の値も割り当てられていない変数には欠損値が設定されます。
ヒント | 最後のフィールドが欠損値であり、対応する変数に欠損値を割り当てたい場合には、MISSOVERを使用します。 |
参照項目 | 行の終わりを超えて読み込む、FLOWOVER、SCANOVER、STOPOVER、TRUNCOVER |
例 | 欠損値と短いレコードをリスト入力で処理する |
入力ポインタで一度にアクセスできる行数を指定します。
デフォルト | DATAステップ内の任意のINPUTステートメントでの#ポインタコントロールの後に指定されている最大数。#ポインタコントロールを省略した場合、デフォルト値は1になります。 |
操作 | このオプションは、ポインタで一度にアクセスできる行数にのみ影響します。INPUTステートメントが読み込む行数には影響しません。 |
ヒント | N=の値よりも小さな値の#ポインタコントロールをINPUTステートメントで使用すると、予期しない結果が発生することがあります。予期しない結果を防ぐには、N=オプションの値に等しい#ポインタコントロールを含めるようにします。次に例を示します。
infile 'external file' n=5;
input #2 name : $25. #3 job : $25. #5; |
レコードからデータが読み込まれなくても、INPUTステートメントには#5ポインタコントロールが含まれます。 | |
例 | ポインタ位置の出力 |
変数名を指定します。この変数には、ストリームレコード形式でデータを読み込む場合に(FILENAMEステートメントでRECFM=Sを指定)、ファイルから読み込むバイト数が含まれます。
デフォルト | ファイルのLRECL値 |
操作 | 読み込むバイト数を-1に設定すると、FTPおよびSOCKETアクセス方式は、入力バッファ内で現在使用可能なバイト数を返します。 |
参照項目 | FILENAMEステートメントのSOCKETアクセス方式でのRECFM=オプション、およびFILENAMEステートメントのFTPアクセス方式でのRECFM=オプション |
record-number | では、順次読み込みの入力ファイルから読み込む最終レコードのレコード番号を指定します。 |
MAX | では、処理するオブザベーションの最大数を指定します。この値は、少なくとも符号付き32ビット整数の最大値と同じ大きさになります。絶対最大値は、お使いの動作環境により異なります。 |
デフォルト | MAX |
ヒント | OBS=とFIRSTOBS=を組み合わせて使用することで、ファイル内に含まれている特定の範囲のレコードを読み込むことができます。 |
例 | 次のステートメントは、ファイルに含まれている先頭から100レコードのみを読み込みます。infile file-specification obs=100; |
LRECL=オプションに指定された長さに達するまで、外部ファイルから読み込むレコードにブランクを追加するかどうかを指定します。
デフォルト | NOPAD |
参照項目 | LRECL=オプション |
入力ファイルにキャリッジコントロール文字が含まれているかどうかを指定します。
ヒント | キャリッジコントロール文字を削除する必要なしにDATAステップでファイルを読み込む場合は、PRINTを指定します。キャリッジコントロール文字をデータ値として読み込む場合は、NOPRINTを指定します。 |
入力ファイルのレコード形式を指定します。
操作 | SAS 9.4では、グローバルLRECLシステムオプションのデフォルト値は32767です。固定長レコード(RECFM=F)を使用する場合、LRECL=のデフォルト値は256になります。 |
動作環境 | record-formatの値は動作環境によって異なります。詳細については、各動作環境向けのSASドキュメントを参照してください。 |
INPUTステートメントが、@'character-string'式に指定された文字列を検出するまで、入力データレコードをスキャンするようにします。
操作 | MISSOVER、TRUNCOVER、およびSTOPOVERオプションを使用すると、INPUTステートメントが@'character-string'式をスキャンしてレコードの終端に到達した場合に、そのINPUTステートメントがどのように動作するかを変更できます。デフォルト(FLOWOVERオプション)では、INPUTステートメントは次のレコードをスキャンします。それ以外のオプションでは、INPUTステートメントはスキャンを中止します。 |
ヒント | SCANOVERとFLOWOVERの両方を指定することは冗長です。 |
参照項目 | 行の終わりを超えて読み込む、FLOWOVER、MISSOVER、STOPOVER、TRUNCOVER |
例 | 指定の文字列の直後に記述された可変長レコードをスキャンする |
FILEステートメントとINFILEステートメントが同じバッファを共有することを指定します。
別名 | SHAREBUFS |
ヒント | INFILE、FILE、PUTステートメントでSHAREBUFFERSオプションを使用すると、外部ファイルを直接更新できます。外部ファイルを直接更新すると、PUTステートメント出力が出力バッファを経由せずに入力バッファから外部ファイルへと直接書き込まれるため、CPU時間を節約できます。 |
また、SHAREBUFFERSを使用すると、レコード全体ではなく、外部ファイル内の特定のフィールドを更新できます。 | |
例 | 外部ファイルの更新 |
注意: |
SHAREBUFFERS、RECFM=V、_INFILE_を使用する際、同一の長さのレコードを読み込んだ後、異なる長さのレコードを含むファイルを更新する場合には注意が必要です。
レコードの長さを変更するには、_INFILE_を使用します。この潜在的な問題を回避する方法の1つとして、元々のレコード長が維持されるように_INFILE_を追加または削除することが考えられます。
|
変数名を指定します。この変数の値は、PUT _INFILE_ステートメントが書き込むレコードの最初の列番号として使用されます。自動変数と同じように、START=に指定した変数はデータセットに書き込まれません。
参照項目 | PUTステートメントの_INFILE_オプション |
INPUTステートメントで、ステートメント内のすべての変数に対する値が見つからずに現在のレコードの終わりに達した場合、DATAステップの処理が停止します。期待された数の値が入力行に含まれていない場合、STOPステートメントが実行されないならば、SASは_ERROR_に値1を設定してデータセットの作成を中止し、不完全なデータ行を出力します。
ヒント | デフォルトの動作に戻すにはFLOWOVERを使用します。 |
参照項目 | 行の終わりを超えて読み込む、FLOWOVER、MISSOVER、SCANOVER、TRUNCOVER |
例 | 欠損値と短いレコードをリスト入力で処理する |
入力データレコードの長さがINPUTステートメントの期待する長さよりも短い場合のINPUTステートメントのデフォルトの動作を無効化します。デフォルトでは、INPUTステートメントは次の入力データレコードを自動的に読み込みます。TRUNCOVERを指定すると、INPUTステートメントの期待する長さよりも短いレコードが存在する場合、可変長のレコードを読み込むことができます。値を割り当てられていない変数には、欠損値が設定されます。
ヒント | TRUNCOVERを使用すると、フィールドの長さが期待された長さより短い場合、入力バッファの内容を変数に割り当てることができます。 |
参照項目 | 行の終わりを超えて読み込む、FLOWOVER、MISSOVER、SCANOVER、STOPOVER |
例 | 指定の文字列の直後に記述された可変長レコードをスキャンする |
バッファリングされた(先行)読み込みを実施しないよう指示します。
別名 | UNBUF |
操作 | UNBUFFEREDを指定すると、SASはEND=変数に値1を設定しなくなります。 |
ヒント | DATALINESステートメントを使用して入力ストリームデータを読み込む場合、UNBUFFEREDが有効となります。 |
この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_変数に値を割り当てると、その変数の長さは、割り当てられた値の長さへと変更されます。 | |
参照項目 | 入力バッファのコンテンツへのアクセス |
例 | 入力バッファ内のレコードを操作する |
put _infile_ $hex100.;
data scores; infile datalines delimiter=','; input test1 test2 test3; datalines; 91,87,95 97,,92 ,1,1 ;
data scores; input test1 test2 test3; datalines; 91,87,95 97,,92 ,1,1 ;
infile datalines dsd;
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;
問題
|
解決策
|
---|---|
SASログに次のようなメッセージが出力されており、データセット内のすべてのデータが読み込み用に表示されています。
One or more lines were truncated. |
多くの場合、これは問題にはなりません。
このメッセージは、次のいずれかの条件が真である場合に表示されます。
このメッセージは、行の長さが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バイトずつ読み込み、必要ならばラインフィード文字を置き換えます。 |
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
----+----1----+----2 1 22 333 4444 55555
data numbers;
infile 'external-file';
input testnum 5.;
run;
infile 'external-file' truncover;
data num; infile datalines dsd; input x y z; datalines; ,2,3 4,5,6 7,8,9 ;
2
が割り当てられます。
a
およびb
が区切り文字として使用されています。 data nums; infile datalines dsd delimiter='ab'; input X Y Z; datalines; 1aa2ab3 4b5bab6 7a8b9 ; proc print; run;
PRD
を区切り文字として使用します。この文字列にはすべて大文字が含まれていることに注意してください。DLMSOPT=オプションを使用することで、PRD
、Prd
、PRd
、PrD
、pRd
、pRD
、prD
、prd
をすべて有効な区切り文字にしています。data test; infile datalines dsd dlmstr='PRD' dlmsopt='i'; input X Y Z; datalines; 1PRD2PRd3 4PrD5Prd6 7pRd8pRD9 ; proc print data=test; run;
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;
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 ;
NOTE: SAS went to a new line when INPUT statement reached past the end of a line.
infile datalines stopover;最初のデータレコードではTEMP4の値が見つからないため、SASは_ERROR_に値1を設定した後、データセットの作成を中止し、データ行1を出力します。
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;
data _null_; infile phonebk truncover scanover; input @'phone:' phone $32.; put phone=; run;
phone=619-555-9340 phone=(213) 555-4820 phone=(49)12 34-56 78-90
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 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;
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 ;
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;
data _null_; infile file-specification-1 length=a; input; a=a-20; file file-specification-2; put _infile_; run;
data _null_; infile file-specification start=s; input; s=11; file file-specification-2; put _infile_; run;
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 ;
Linept=2 Columnpt=9 Linept=2 Columnpt=8
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;
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;
city=Jackson minutes=25 city=Jefferson minutes=15 city=Joliet minutes=65
data _null_; infile phonbill; input; put _infile_; run;
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>
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;
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
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;
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
libname myfiles 'SAS-library'; filename extfile 'external-file'; data myfiles.unicode; infile extfile encoding="utf-8"; input Make $ Model $ Year; run;