Jiangtang's profile技止于此BlogListsNetwork Tools Help

Blog


    1/20/2008

    用SAS读入原始数据(1):文本文件

    文本文件多以.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提供了以下四种基本的输入模式:

    1. 列输入模式(Column) ——应用于字段固定的文本文件
    2. 格式化输入模式(Formatted) ——应用于字段固定的文本文件
    3. 列举输入模式(List) ——应用于分隔符固定的文本文件
    4. 命名输入模式(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;

    优点:

    1. 对字段的选择非常灵活,可以任意选择字段,以及安排读入的次序;
    2. 整个字段或其部分可以重复读入;
    3. 字段间不一定要有空格或者其他分隔符来分隔;
    4. 字符变量最多可含32K个字符,并可以包含空格符;
    5. 对缺失数据没有特殊占位符的要求。一个空格字段就读为一个缺失值,也不会引起其他字段读入的错误。

    局限:

    1. 可以设定输入长度,但不可以设定输入格式。对数值型变量,只能读入标准数据值(Standard Numeric Data Value),即只包括数字、正负号、小数点和科学计数符号E构成的数,对日期型数据,以及包含美元符号、逗号等其他符号的数值,因为需要设定输入格式并按格式读入,列输入模式就无法正确读取。

    2.格式化输入模式(Formatted)--应用于字段固定的文本文件

    格式化输入模式类似于列模式:

    1. 它适用于字段固定格式的数据文件;
    2. 它也给出字段开始的列数,但不直接给出结束列数,而是通过输入格式给出读入长度;
    3. 它可以设定输入格式。

    它的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.

    参考资料:

    1. 汪嘉冈《SAS V8基础教程》,北京:中国统计出版社,2001
    2. SAS OnlineTutor: Basic and Intermediate SAS
    Technorati Tags:

    Comments (3)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    No namewrote:
    您需要二手液晶显示屏废旧液晶屏么?我们是不折不扣的二手液晶屏、旧液晶屏大批发商,长期大量供应可再利用的旧液晶屏。我公司提供的各种尺寸的二手液晶屏, 不同厚薄如笔记本屏,均已经过我们严格的分类,检验,测试流程。请访问协力液晶屏www.sceondhandlcd.com[ghfddbcdgjbjjgg]
    Nov. 21
    Nov. 9
    Nov. 3

    Trackbacks

    The trackback URL for this entry is:
    http://johnthu.spaces.live.com/blog/cns!2053CD511E6D5B1E!376.trak
    Weblogs that reference this entry
    • None