📜  在SAS中读取原始数据

📅  最后修改于: 2021-01-08 14:14:17             🧑  作者: Mango

在SAS中读取原始数据

在上一个主题中,我们学习了如何在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文件读取数据,并以表格形式给出数据值。