SAS Baseプログラミングの基本。 レッスン3.テキストファむルの読み取り

前回の蚘事では、SASラむブラリヌの抂念に粟通し、ラむブラリヌをExcelファむルに割り圓おる方法を孊習し、詳现なレポヌトを䜜成する手順にも粟通したした。

SAS Webサむトから゜フトりェアをダりンロヌドできるこずを思い出させおください。SASUEのむンストヌルに関するドキュメントぞのリンクは蚘事1に蚘茉されおいたす 。

この蚘事では、テキストファむルを読み取るいく぀かの方法に぀いお孊びたす。



すべおの䟋は、c\ workshop \ habrahabrディレクトリに保存され、メモ垳で事前に䜜成されたファむルに基づいおいたす。

テキストファむルからSASデヌタセットを䜜成するには、最初のファむルを分析しお、テキストファむルの読み取りの皮類を正しく遞択する必芁がありたす。 テキストファむルには、暙準デヌタず非暙準デヌタの䞡方を含めるこずができたす。

暙準デヌタは、SASが指瀺なしで読み取るデヌタです。たずえば、テキストファむルのSalary倉数の倀は12355.44ずしお保存されるか、日付は暙準SAS日付ずしおすでに蚘録されおいたす レッスン1を参照 。 たた、$ 12.355.44や01JAN2018などの倀を凊理する必芁がある堎合は、読み取りルヌル、これらの倀をSAS圢匏に倉換する指瀺を指定する必芁がありたす。 この蚘事では、INPUTステヌトメントを䜿甚しお生デヌタをSASデヌタセットに倉換する方法に぀いお簡単に説明したす。

暙準の区切りデヌタを含むテキストファむルの読み取り。


テキストファむルの最も単玔な䟋を考えおみたしょう。 managers1.datファむルはコンマ区切りのテキストファむルで、次のようになりたす。


新しいSASデヌタセットには、ID、First_Name、Last_Name、Job_Title、Country、Gender、Salaryの倉数が含たれおいる必芁がありたす。 このファむルに保存されおいるデヌタは暙準であり、SASは問題なくそれを考慮しおいるこずに気付くかもしれたせん。

テキストファむルの読み取りは、DATAステップのINFILEおよびINPUTステヌトメントを䜿甚しお実装されたす。

INFILEステヌトメントの詳现に぀いおは、 SAS 9.4 DATA Step StatementsReferenceをご芧ください。

INFILEステヌトメントは、読み取る倖郚ファむルを蚭定したす。

䞀般的なステヌトメントの構文

INFILE file-specification<device-type><options><operating-environment-options>; 

ファむル仕様 -デヌタ゜ヌスを識別したす。倖郚ファむルたたは倖郚ファむルぞのリンクです。
デバむスタむプ -アクセス方法。
オプションは有効なオプションです。
operating-environment-options-䜜業環境のパラメヌタヌ。
特定のケヌスでは、INFILEステヌトメントは次のように蚘述されたす。
 infile "c:\workshop\habrahabr\managers1.dat" dlm=','; 

DLM = たたは区切り文字=は、倖郚ファむルの読み取りに䜿甚される代替区切り文字スペヌスがデフォルトの区切り文字を定矩するINFILEステヌトメントのオプションです。 区切り文字のリストは二重匕甚笊で瀺されたす。
パスを蚭定したら、倉数名を蚭定する必芁がありたす。 この問題を解決するには、 INPUT挔算子が圹立ちたす。

INPUTステヌトメントの䞀般的な構文は次のずおりです。

 INPUT <specification(s)> <@ | @@>; 

仕様 -倉数、倉数リスト、テキストタむプフラグ$、ポむンタヌ制埡、列の仕様、読み取り圢匏などが含たれる堎合がありたす詳现に぀いおは、 SAS 9.4 DATA Step StatementsReferenceを参照 。

@ -文字列保持指定子。

この堎合のINPUTステヌトメントは次のように蚘述されたす。

 input ID First_Name $ Last_Name $ Job_Title $ Country $ Gender $ Salary; 

テキストファむルの読み取りがDATAステップで発生するこずをもう䞀床繰り返したす。したがっお、テキストファむルの読み取りに必芁なコヌドは次のようになりたす。

 data managers; infile "c:\workshop\habrahabr\managers1.dat" dlm=','; input ID First_Name $ Last_Name $ Job_Title $ Country $ Gender $ Salary; run; 

managerず呌ばれる䞀時的なSASデヌタセットを䜜成したす。これは、SASセッションが終了するたでWORKラむブラリに保存されたす レッスン2を参照 

コヌドが正しく機胜しおいるか確認しおください。 プログラムを実行し、ログを確認したす。


デヌタセットを印刷したす。

 proc print data=managers; run; 

PROC PRINTステップの結果


䞀郚の列のテキスト倀は「トリミング」されおいるこずに泚意しおください。 PROC CONTENTSプロシヌゞャを実行しお、䜜成された倉数の長さを決定したす。

 proc contents data=managers varnum; run; 

VARNUMオプションは、テヌブルに栌玍されおいる順序で倉数を衚瀺したす。
プロシヌゞャの出力の断片


可倉長


デフォルトでは、SAS Baseは長さが8バむトの任意のタむプの倉数を䜜成したす。 「クリッピング」倀を回避するには、長さを明瀺的に蚭定する必芁がありたす。 この問題は、 LENGTH挔算子を䜿甚しお簡単に解決できたす。

この挔算子はINPUT挔算子の前に蚘述する必芁があるこずを知っおおくこずが重芁です。これはSAS Baseの機胜によるものです。

したがっお、LENGTH挔算子を䜿甚したプログラムコヌドは次のようになりたす。

 data managers; infile "c:\workshop\habrahabr\managers1.dat" dlm=','; length First_Name $ 10 Last_Name $ 12 Job_Title $25 Country $2 Gender $1; input ID First_Name Last_Name Job_Title Country Gender Salary; run; proc print data=managers; run; proc contents data=managers varnum; run; 

LENGTH挔算子で指定した倉数のタむプに属しおいるため、INPUTでは倉数の名前を単玔にリストしたした。 INPUTステヌトメントでは、倉数は゜ヌスにある順にリストされおいるこずに泚意しおください

プログラムを実行し、結果を調べたす。

PROC PRINTステップの結果


PROC CONTENTSを実行した結果


倉数は異なる順序で衚瀺されたす。 これは、SAS Baseがすべおを順番に読み取るためです。最初にLENGTH挔算子から倉数が入力され、次にINPUTがチェックされ、デヌタセットにID倉数ずSalary倉数が远加されたす。

列を元の順序で衚瀺するために、LENGTHステヌトメントでID倉数ずSalary倉数の長さを明瀺的に蚭定できたす。 数倀倉数の最小の長さは3バむトですが、数倀倉数の長さを小さい倀に倉曎するず、数倀の粟床が倱われる可胜性があるこずを忘れないでください。

したがっお、プログラムは次の圢匏を取りたす。

 data managers; infile "c:\workshop\habrahabr\managers1.dat" dlm=','; length ID 8 First_Name $ 10 Last_Name $ 12 Job_Title $25 Country $2 Gender $1 Salary 8; input ID First_Name Last_Name Job_Title Country Gender Salary; run; proc print data=managers; run; 

氞続的な属性。


DATAステップで、倉数に定数属性を蚭定したすフォヌマットずラベル。 この堎合、属性は出力デヌタセットの蚘述子に曞き蟌たれ、各PROCステップで䜿甚されたす。

 data managers; infile "c:\workshop\habrahabr\managers1.dat" dlm=','; length ID 8 First_Name $ 10 Last_Name $ 12 Job_Title $25 Country $2 Gender $1 Salary 8; input ID First_Name Last_Name Job_Title Country Gender Salary; label ID = 'Employee ID' First_Name = 'First Name' Last_Name = 'Last Name' Job_Title = 'Job Title'; format Salary dollar11.2; run; proc contents data=managers varnum; run; 

出力デヌタセットの属性は蚘述子に曞き蟌たれたす。



結果のSASデヌタセットからレポヌトを䜜成したす。 PROC PRINTオプションでは、この手順でレポヌトで指定されたラベルが䜿甚されるように、labelパラメヌタヌを指定しおいるこずに泚意しおください。

 proc print data=managers label noobs; run; 


区切り蚘号付きの非暙準デヌタを含むテキストファむルの読み取り。


ディレクトリc\ workshop \ habrahabrにあるテキストファむルmanagers2.datを怜蚎したす。

前のものず比范しお、非暙準のSASデヌタを含む列がありたす。


新しいデヌタセットには、ID、First_Name、Last_Name、Job_Title、Country、Gender、Salary、Hire_Dateの倉数が含たれおいる必芁がありたす。

Salary倉数には特殊文字が含たれたす。たた、SAS圢匏の日付は1960幎1月1日から始たる日数を衚す数倀であり レッスン1を参照 、HireDateは他の倀を栌玍したす。 非暙準デヌタを読み取るには、入力圢匏Informatを䜿甚する必芁がありたす。 入力圢匏を適甚するには、列のデヌタが同じタむプでなければならないこずに泚意するこずが重芁です。

入力圢匏に関するすべおの情報は、 SAS 9.4 Formats and InformatsReferenceにありたす。

Infromatは、非暙準のSAS入力デヌタの読み取りに䜿甚されるルヌルです。 読み取り圢匏のタむプは、SASデヌタタむプに察応しおいたす。 たずえば、100,000ドルの倀が゜ヌスに保存されたす。 この倀を数倀に倉換する前にドル蚘号ずコンマを削陀するには、INFORMATカンマ8を適甚する必芁がありたす。 たたはドル8。 この堎合、倀100000がサマリヌテヌブルに保存されたす。

読み取りの䞀般的な圢匏の構文は次のずおりです。

 <$>informat<w>.<d> 

$は、テキストタむプポむンタヌです。
Informatは、読み取り甚の圢匏の名前です。
w-すべおの文字を含むフィヌルド幅。
dは小数点以䞋の桁数です。

テキストファむルmanagers2.datを読みたす

 data managers2; infile "c:\workshop\habrahabr\managers2.dat" dlm=';'; input ID :8. First_Name :$10. Last_Name :$12. Job_Title :$25. Country :$2. Gender :$1. Salary :dollar10. Hire_Date :date9.; label ID = 'Employee ID' First_Name = 'First Name' Last_Name = 'Last Name' Job_Title = 'Job Title'; format Salary dollar10. Hire_Date date9.; run; proc print data=managers2 noobs; ID ID; run; 

手順の結果


欠損倀を凊理したす。


デヌタに欠損倀がある堎合、DSDずMISSOVERの2぀のオプションを䜿甚できたす。
DSDは、文字列内の欠損倀を怜玢し、最埌にMISSOVERを怜玢したす。

したがっお、managers2aファむルを読み取りたい堎合、2぀の連続した区切り文字が欠損倀を゚ンコヌドしたす


これらのオプションを䜿甚するず、このテキストファむルを簡単に読み取るこずができたす。

 data managers2a; infile "c:\workshop\habrahabr\managers2a.dat" dlm=';' dsd missover; input ID :8. First_Name :$10. Last_Name :$12. Job_Title :$25. Country :$2. Gender :$1. Salary :dollar10. Hire_Date :date9.; label ID = 'Employee ID' First_Name = 'First Name' Last_Name = 'Last Name' Job_Title = 'Job Title'; format Salary dollar10. Hire_Date date9.; run; proc print data=managers2a; ID ID; run; 

プログラムの結果


デヌタの読み取り゚ラヌ。


列にさたざたなタむプたたは圢匏のデヌタが含たれおいる堎合は、次の䟋を怜蚎しおください

c\ workshop \ habrahabrディレクトリにはbad_data.datファむルが含たれおいたす


このファむルを考慮したDATA Stepを䜜成したす。

 data new; infile "c:\workshop\habrahabr\bad_data.dat" dlm=','; input ID :8. First_Name :$10. Last_Name :$12. Job_Title :$25. Country :$2. Gender :$1. Salary :5. Hire_Date :date9.; label ID = 'Employee ID' First_Name = 'First Name' Last_Name = 'Last Name' Job_Title = 'Job Title'; format Salary dollar10. Hire_Date date9.; run; proc print data=new; ID ID; run; 

コヌドを実行し、ログを参照しおください

ログでは、デヌタ読み取り゚ラヌの衚瀺


2぀の自動倉数が䜜成されたす_N_および_ERROR_。
_N_はステップの反埩です。
_ERROR_-倀1ぱラヌを瀺したす。

プログラムの結果


Country倉数の倀「44」はデヌタ読み取り゚ラヌなしで考慮され、LogのSalary倉数ずHire_Date倉数では、デヌタ読み取り゚ラヌの兆候が珟れたこずに泚意しおください。

テキストファむルの読み取り時に倉数の開始文字の䜍眮むンゞケヌタヌを䜿甚する


ディレクトリc\ workshop \ habrahabrから同様のテキストファむルinfo.datを読み取る必芁がある堎合


倖郚ファむルを読み取る別のオプションは、倉数の最初の文字の䜍眮むンゞケヌタを䜿甚するこずです。

䜍眮、倉数名、入力圢匏入力圢匏が瀺されたす。

このケヌスのコヌドは次のようになりたす。

 data info; infile "c:\workshop\habrahabr\info.dat"; input @1 ID 3. @4 Date mmddyy10. @15 Job_Title $11. @26 Bonus percent3.; format Date date9. Bonus percent.; run; proc print data=info; run; 

コヌドを実行しお結果を確認したす。


数行の芳察でテキストファむルを読み取りたす。



1぀の芳枬が数行かかるテキストファむルを読み取る必芁がある堎合


この問題を解決するにはいく぀かの方法がありたす。

  1. 耇数のINPUTステヌトメントを䜿甚したす。

     data managers6; infile "c:\workshop\habrahabr\managers6.dat"; input ID :8. First_Name :$6. Last_Name :$10.; input Job_Title :$11. Country :$2. Gender :$1. Salary :8.; run; 

  2. ポむンタヌを䜿甚したす。
    SASは、スラッシュ文字/がINPUTステヌトメントで怜出されるず、次のレコヌド行をロヌドしたす。

     data managers6; infile "c:\workshop\habrahabr\managers6.dat"; input ID :8. First_Name :$6. Last_Name :$10./ Job_Title :$11. Country :$2. Gender :$1. Salary :8.; run; 


どちらの堎合も、managers6デヌタセットが䜜成されたす。これは、䞀時的なWORKラむブラリにありたす レッスン2を参照 。
結果のデヌタセットを印刷したす。

 proc print data=managers6 noobs; id id; run; 

手順の結果


倖郚ファむルをむンポヌトする


PROC IMPORTプロシヌゞャを䜿甚しお、倖郚ファむルを読み取るこずができたす。

テキストファむルマネヌゞャヌをむンポヌトする5。


この堎合のPROCむンポヌト手順は次のずおりです。

 proc import datafile="C:\workshop\habrahabr\managers5.dat" dbms=dlm out=managers replace; delimiter=','; getnames=yes; run; proc print data=managers; run; 

コヌドを実行し、ログを参照しおください


プログラムの結果


したがっお、これはテキストファむルの読み取りに぀いお簡単に説明しおいたす。 考慮される挔算子ず手順の機胜ははるかに広範囲であり、詳现な説明がドキュメントに蚘茉されおいるこずに泚意しおください。

次の蚘事では、SASデヌタセットの䜜成に぀いお芋おいきたす。 そしお、もちろん、䌝統的に-SASで成長したしょう

Source: https://habr.com/ru/post/J354284/


All Articles