本文概述
在上一个主题中, 我们学习了如何在SAS编程中合并数据集。现在, 我们将学习SAS的读取能力, 以及如何从各种文件中读取原始数据。我们还将学习输入一些特殊类型的数据值。
如前所述, 原始数据文件是SAS临时存储的, 用于执行程序的文件。在SAS中, 我们可以从许多类型的文件中读取原始数据, 例如文本, excel, CSV层次结构等。
SAS的阅读能力
1.读取空格分隔的值
由空格分隔的数据值通常称为列表。每个值一个或多个空格分隔。如果缺少值, 则应由占位符指向它们, 例如点(。)或句号或句点。
请注意, 点(。)用于指示数字或字符变量的缺失值。
例如:
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也在读取缺失值的地方。
2.如何输入流内数据
我们可以通过两种方式向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;
输出
你可以在输出中看到, 数据已经以表格形式输入。
3.在同一行输入多个案例的数据
在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。但是请确保如果使用文字处理程序打开原始数据文件, 则可以打开仅另存为文本的文件。
你将需要一本密码本来读取原始数据文件。该代码簿提供有关文件中包含的数据的信息。一些常用的原始数据文件类型是:
- 以空格分隔的值:它包含列表形式的数据。
- 逗号分隔值:通常来自Excel, 文件扩展名为.csv。
- 制表符分隔的值:这是一种文本文件(.txt文件), 来自许多不同的应用程序, 包括Excel。
- 固定列数据:这是一种包含信息性数据的形式。
要从文件读取原始数据, 数据步骤必须包括以下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时, 可以停止阅读。
1.从文本文件(.txt文件)读取
包含文本格式数据的文件称为文本文件。通过保存扩展名为.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;
输出
2.从逗号分隔的值(.csv文件)中读取
由逗号或管道分隔的原始数据值称为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;
其中
- delimiter =”, “或dlm =”, “表示在原始数据文件中使用逗号分隔值。
- firstobs:告诉行号(firstobs = 2), 从SAS可以开始读取原始数据文件。这是实际值开始的行。
- dsd:指示SAS读取连续逗号作为缺失值。
输出
3.从Excel文件(.xls)读取
包含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文件读取数据, 并以表格形式给出数据值。
4.从分层文件读取
在分层文件中, 数据以分层格式表示。这些类型的文件包含观察结果;记录的数量可能因观察而异。以下是分层文件的示例。
在下面的文件中, 列出了每个分支下每个学生的详细信息。分支的名称将被视为变量或列, 并被记录为观察值或行。为了阅读代码, 我们使用下面的代码, 在其中可以使用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文件读取数据, 并以表格形式给出数据值。
评论前必须登录!
注册