数据清洗DATA CLEARING之infile选项之三 SCANOVER

关于infile的选项scanover,有一个最简单的例子。
data x;
infile datalines  scanover truncover;
input @’abc’  var1 var2;
datalines;
134 234 123 145
321 abc 241 456
548 890 abc 345
296 456 123 127
;

该代码可以读取特征标签字符abc后面的字段,根据需要和missover,truncover结合使用。
 
SAS/help里面有个讲SCANOVER的例子,这个看起来还比较实用些。为了好演示,我稍作修改:
data ex;
infile datalines  scanover truncover;
   input @’phone:’ phone $32.;
   datalines;
    Jenny’s Phone Book
    Jim Johanson phone: 619-555-9340
       Jim wants a scarf for the holidays.
    Jane Jovalley phone: (213) 555-4820
       Jane started growing cabbage in her garden.
       Her dog’s name is Juniper.
    J.R. Hauptman phone: (49)12 34-56 78-90
       J.R. is my brother.
;
run;
这个代码可以从一堆数据找出所要的字段,上面就是找出电话号码,这个例子比较简单。当然用同样的方法可以从数据堆中得到例如网站地址,email地址,电话号码等等感兴趣的字段了(当然要满足一定的规律,如前面都有特征标签字段)。
 
如果我想把某一页面里面的titles保存为一个数据集,怎么办?
源数据获得方法:1,上sasor网站,点击“搜索"
                         2, 输入某个id,回车,得到一个查询结果网页
                        3,点浏览器工具栏”查看“-”源文件(C)“,得到一个文本文档,另存为源数据:dataforscanover.txt,这里面保存着该页面所有的Titles,就用它来test吧。
 
先上代码吧,用代码来说明问题:
filename outdata ‘F:\saschm\samplefileforB\dataforscanover.txt’;
data ex(drop=xx);
 infile outdata  scanover LRECL=1152;
   input @’class="topictitle">’ xx $64. @’class="topictitle">’ title $64. ;
    title=scan(title,1,"<");
run;
用print语句看看结果吧:
 
Obs    title
  1    讨论何种方式最有效地得到数据表的观测数?
  2    SAS中文论坛北京聚会通知(最新)
  3    求助:Metlab
  4    这种数据如何按这个要求读入
  5    SAS中文论坛&amp;SASOR北京网友9月聚会纪要
  6    SAS Question (3)
  7    [求助]SAS 数据转化 帮忙
  8    SAS Question 2
  9    SASOR期刊即将推出
 10    用SAS9.1.3的人多吗?
 11    SASOR第一份期刊已经完成
 12    请教:为什么SAS公司把1582年作为可以视为日期的“第一年”呢?
 13    又一个棘手的SAS数据集转换问题
 14    数据集转换问题
 15    Data Summary,questioned by max_ fromSAS中文
 16    哪儿兄弟指点一下:SAS如何做抽样分析?比如从1亿条记录集中抽取
 
上面的结果暂时让人很满意,与网页的搜索结果很一致。
 
但是在test过程中遇到了不少的问题,
1,首先实际的一行数据有很多比如这次保存的数据一行长度达到了1045,显然默认的256是不够的,那么需要通过option:LRECL=logical-record-length,来指定吧单位是byte(SAS9.13中最大值为1048576bytes,即是1M)。这个值如果小于一样的字段bytes,那么后面的字段将会都被截断,不会读取。如果设定太大,会出现占用大量资源的情况(如果有机会在后面探讨一下),所以需要选个合适大小的lercl。【TIPS:那怎么来设定lrecl的大小?最简单的方法是根据log里面的提示来设定,选用一个合适保险的,具体方法就是设成足够大,然后它提示最长记录是多少,然后设定的值只要比它大即可。】
2,选择一个特征标签字段,这个有规律字段就在我们感兴趣字段的前面,一般都会用的。这里我们碰巧遇到了class="topictitle">字段,就用这个,不过出现了一个问题,因为还有一个字段也是以它为特征标签字段的,那就一起读吧,于是有了变量xx,当然后来把这个不感兴趣的字段drop掉就可以了。得到的title变量里面的字段后面会跟着符号”>*****“一样的多个字段,用一个scan函数【函数也是SAS系统非常重要的工具,后面会浓墨描述,^_^】剪掉,于是就得到干干净净的title字段。
 
小结:一般情况下,我们从SAS/HELP文件,或者一些SAS教程中往往能看到一些简单专门讲单个语句,或者option,或者函数等单元功能部分。在实际应用中往往会全面整体去考虑,会运用到SAS的多个方面的知识点,因此SAS的编程语言认为是一个学习门槛很高的语言。学习过程需要花费很长的时间,是一个长期积累的过程。
 

相关博文

发表评论

电子邮件地址不会被公开。 必填项已用*标注