📅  最后修改于: 2021-01-08 14:14:17             🧑  作者: Mango
在上一个主题中,我们学习了如何在SAS编程中合并数据集。现在,我们将学习SAS的读取能力,以及如何从各种文件中读取原始数据。我们还将学习输入一些特殊类型的数据值。
如前所述,原始数据文件是SAS临时存储的,用于执行程序的文件。在SAS中,我们可以从许多类型的文件中读取原始数据,例如文本,excel,CSV层次结构等。
由空格分隔的数据值通常称为列表。每个值一个或多个空格分隔。如果缺少值,则应由占位符指向它们,例如点(。)或句号或句点。
请注意,点(。)用于指示数字或字符变量的缺失值。
例如:
data student;
input roll name$ game$ age weight height$;
datalines;
1 Anuj football . 64 161
5 lata tennis 23 60 155
2 Vinita badminton 30 65 .
7 Kumar football 29 . .
4 Anita tennis 29 65 153
3 Tarun football 21 70 162
6 preeti badminton 24 57 157
;
run;
proc print data=student;
run;
输出:
从输出中可以看到,每个用空格分隔的值都在创建一个列表。我们在缺失值的位置提供了点(。),SAS也在读取缺失值的地方。
我们可以通过两种方式向SAS提供读取数据的方式,一种是当数据太大时,可以从外部文件读取数据而不是键入数据,但是当数据太小时,在SAS程序中键入数据很方便而不是从外部文件读取它。它被称为流数据。这是在SAS中输入数据的快速方法。
要输入此类数据,您将需要4种基本类型的语句:
数据值之间必须至少有一个空格,但是我们也可以提供多个空格。即使值丢失,每个变量也必须有一个占位符。句点(。)表示以这种方式输入的字符和数字变量都缺少值。无需在列中精确对齐数据。
例如:
data salary;
input name $ id sex $ salary age;
cards;
Sumit 120 M . .
Kiran 135 F 55000 40
Bunty 126 . 48000 45
Anita 134 F 37800 33
Varun 162 M 69000 60
;
proc print data=salary;
run;
输出:
您可以在输出中看到,数据已经以表格形式输入。
在SAS中,在某些情况下,我们可以使用@@在同一行上输入原始数据。
例如:
data demo;
input a b group @@;
cards;
1 2 AB 6 17 AB 13 28 CD 14 34 CD 16 54 EF 18 23 EF
21 21 GH 34 29 GH 19 20 IJ 56 57 IJ 42 92 KL 67 78 KL
;
proc print data=test;
run;
当您在SAS studio中执行此代码时,将获得以下输出,表明已输入数据:
输出:
我们可以在输出中看到,在某些情况下已经输入了数据。
在SAS中,当数据太大时,请从外部文件读取数据,而不要键入数据。我们可以从许多不同的来源读取数据,例如从数据库程序,电子表格程序或excel等导出的数据。
为此,首先,确保您应该了解原始数据文件的特征。您可以使用文本编辑器或文字处理程序读取和检查原始数据。
对于小文件,可以使用Windows记事本,对于大文件,可以使用Microsoft Word或Word Perfect。但是请确保如果使用文字处理程序打开原始数据文件,则可以打开仅另存为文本的文件。
您将需要一本密码本来读取原始数据文件。该代码簿提供有关文件中包含的数据的信息。一些常用的原始数据文件类型是:
要从文件读取原始数据,数据步骤必须包含以下3条基本语句:
我们可以在数据步骤中添加其他语句来创建新变量,重新编码变量并执行数据转换。
SAS数据步骤非常简单,可以读取SAS中的原始数据。 DATA语句提供创建数据集的名称,infile语句指示读取原始数据文件。
例如:
data test; /* test is a dataset */
infile in; /* in is a raw data file */
input @1 Name $10. /* read a record */
@20 Age 2. ; /* with two fields */
run; /* end of step */
您可以在示例中看到,测试是由DATA语句创建的数据集,而INFILE用于读取原始数据文件,即in。Input语句列出了要按原始数据文件的相同顺序读取的变量。
在SAS中,我们可以使用循环来控制数据读取。您不能在变量列表的开头跳过任何变量,但是可以在到达列表末尾之前停止读取变量。
例如:
data _null_; /* don't need dataset*/
infile in; /* raw file in */
input @1 Name $10; /* read a record */
list; /* list buffer in log*/
if _n_ > 30 then /* stop after 30, adjust as needed */
stop; /* stop */
run; /* end of step */
从示例中可以看到,当索引超过30时,可以停止阅读。
包含文本格式数据的文件称为文本文件。通过保存扩展名为.txt的数据来生成这种类型的文件。这些文件的数据由空格定界,但是也可以由SAS处理各种定界符。让我们通过一个示例来了解SAS如何使用infile语句读取文本文件。
例如:
Data student;
infile 'C:/Users/ajeetraman/Documents/OfficeWork/student_data.txt ' dlm= ' , ' firstobs=2 dsd;
input roll name sex;
run;
proc print data=student;
run;
输出:
由逗号或管道分隔的原始数据值称为CSV(逗号分隔值)。要读取此类文件,请在infile语句中使用定界符或缩写dlm。
例如:
Data test;
infile 'C:/Users/ajeetraman/Documents/OfficeWork/student_data.csv' dlm=',' firstobs=2 dsd;
input roll name sex;
run;
proc print data=test;
run;
哪里,
输出:
包含excel格式数据的文件称为excel文件。这些类型的文件是通过保存扩展名为.xls的数据生成的。考虑以下示例:
Data student;
infile 'C:/Users/ajeetraman/Documents/OfficeWork/student_data.xls ' dlm= ' , ' firstobs=2 dsd;
input roll name sex;
run;
proc print data=student;
run;
上面的代码用于从excel文件读取数据,并以表格形式给出数据值。
在分层文件中,数据以分层格式表示。这些类型的文件包含观察结果;记录的数量可能因观察而异。以下是分层文件的示例。
在下面的文件中,列出了每个分支下每个学生的详细信息。分支的名称将被视为变量或列,并被记录为观察值或行。为了阅读代码,我们使用下面的代码,在其中可以使用IF识别变量记录,并使用循环获取观察结果。
例如:
Data student (drop = type);
Length Type $ 3 Branch
enrolment$ 2 stdname$ 2 subject 4;
retain Branch
infile 'C:/Users/ajeetraman/Documents/OfficeWork/student_data.xls ' dlm= ':';
input Type $ @;
if Type= 'Brnch' then input Branch $;
else do;
input enrolment 2 stdname$ 2 subject$ 4;
output;
end;
run;
上面的代码用于从excel文件读取数据,并以表格形式给出数据值。