文本文件多以.txt、.dat以及.csv为后缀(在Unix/Linux世界,还可能出现.data数据甚至没有后缀的情况)。一般分两种,其一看起来跟下面一样——如果用UltraEdit等编辑器打开,你能看到指示列数的标尺,而且每个字段的列数是固定的,称为字段固定(Fixed Fields)的文本文件:
2810 61 MOD F
2804 38 HIGH F
下面的数据中,每个字段的列数不必相同,但都由同一样个的分隔符(这里是逗号)分开,所以称为分隔符固定(Delimited Data)或者自由格式(Free-format)的文件文件。如果分隔符为逗号(通常以.csv为后缀),干脆就叫做“用逗号分隔的文本文件”:
1-Mar-90,LON,198
13-Mar-90,FRA,2073
对以上两种文本格式的数据,SAS提供了以下四种基本的输入模式:
- 列输入模式(Column) ——应用于字段固定的文本文件
- 格式化输入模式(Formatted) ——应用于字段固定的文本文件
- 列举输入模式(List) ——应用于分隔符固定的文本文件
- 命名输入模式(Named)
对以上几种输入模式,基本的语句如下,区别就在于input语句的具体设定:
data 你对导入数据的命名;
infile 源文件名,加上具体的盘符位置;
input 变量输入设定;
run;
1.列输入模式(Column)--应用于字段固定的文本文件
对字段固定的源文件,input语句的形式是
input 变量名1<s>开始列数-结束列数 变量名2<s>开始列数-结束列数 …;
一个能工作的列输入模式语句看起来就像下面展示的:
data work.example1;
infile 'C:/data/example1.dat' firstobs=2 obs=100;
input ID 1-3 Name $ 5-10;
run;
优点:
- 对字段的选择非常灵活,可以任意选择字段,以及安排读入的次序;
- 整个字段或其部分可以重复读入;
- 字段间不一定要有空格或者其他分隔符来分隔;
- 字符变量最多可含32K个字符,并可以包含空格符;
- 对缺失数据没有特殊占位符的要求。一个空格字段就读为一个缺失值,也不会引起其他字段读入的错误。
局限:
- 可以设定输入长度,但不可以设定输入格式。对数值型变量,只能读入标准数据值(Standard Numeric Data Value),即只包括数字、正负号、小数点和科学计数符号E构成的数,对日期型数据,以及包含美元符号、逗号等其他符号的数值,因为需要设定输入格式并 按格式读入,列输入模式就无法正确读取。
2.格式化输入模式(Formatted)--应用于字段固定的文本文件
格式化输入模式类似于列模式:
- 它适用于字段固定格式的数据文件;
- 它也给出字段开始的列数,但不直接给出结束列数,而是通过输入格式给出读入长度;
- 它可以设定输入格式。
它的input语句的格式为:
input <指针控制> 变量名 输入格式 …;
注1:指针控制,就是将输入列指针控制在某个位置,作为读入字段的开始列号,它有 @n 或者 +n 的形式:
- @n表示从第n列开始读入(指示开始列数的绝对位置);
- +n表示将列控制指针增加n列侯读入(指示相对位置)。
一个能工作的格式化输入模式语句看起来就像下面展示的:
data work.example2;
infile 'C:/data/example2.dat';
input Name $ 2. @3 Job $5. +7 Place $8.;
run;
3.列举输入模式(List)--应用于分隔符固定的文本文件
因为分隔符固定的数据可以用分隔符来确定字段,input语句特别简单:
input 变量名<s>…;
如果要读入非空格分隔符的数据,就需要在infile语句中指明(默认为空格):
infile 文件盘符 <dlm="分隔符">;
在列举模式下,变量长度的缺省值为8,长度超过8的字符变量在读入时会被截断,这时可以用lenght语句来设定长度:
length 变量名<s> 长度;
列举模式也可以设定输入格式,这只需要在输入变量设定时附加上相关修饰:
input 变量名<s>: 输入格式 …;
一个能工作的列举输入模式语句看起来就像下面展示的:
data work.example3;
infile 'C:/data/example3.dat' dlm=',';
length item $ 10.;
input ID Name $ item $ income:comma9.;
run;
4.命名输入模式(Named)
命名输入模式很少见到,因为很难得见到这种格式的原数据,其中三个变量是ID、Name和Score:
1 Name=Tom Score=A
2 Name=Jim Score=C
相应的input语句为:
input ID Name=$3. Score=$1.