作者joyce618 (joy)
站内Statistics
标题[程式] 有关sas资料处理的问题想请教各位,谢谢^^
时间Mon Jun 6 12:58:58 2011
------------------------------------------------------------------------
[软体程式类别]:
SAS
[程式问题]:
资料处理
[软体熟悉度]:
低(1~3个月)
[问题叙述]:
不好意思,由於最近在写sas的作业,有出现一些资料处理的问题,
需要再麻烦各位大人了
原始的TXT档长相如下:
公司 年 月 日 概估年月 财务报表公告日
XXXX 甲公司 2010 4 30 200912 20100430
XXXX 甲公司 2010 4 30 201003 20100430
XXXX 甲公司 2010 8 31 201006 20100831
XXXX 甲公司 2010 10 29 201009 20101029
YYYY 乙公司 2010 3 10 201002
YYYY 乙公司 2010 4 9 201003 20100429
YYYY 乙公司 2010 4 29 200912 20100429
YYYY 乙公司 2010 4 29 201003 20100429
因为之前有读取过类似格式的TXT档,发现偶有些TXT档好像导出资料的时候用
TAB做分隔,因此读取的时候我是另加DELIMITER='09'X的语法,这次也是利用
这样的方式读取TXT档,但是在档案中财务报表公告日那列原来为空格的储存
格,读进SAS後竟然不是遗失值,而是自动读取公司代码,因为我原来打算要把
有空格那列的资料删除,可是这下就没办法用「IF 变数=. THEN DELETE」的作法,
後来我试着用「IF 变数=公司代码 THEN DELETE」,可是我发现,有些空白格读
入的不一定是同一列的公司代码,而是下一列不同的公司代码,因此到这里小妹
又卡住了,不知道要如何将财务报表公告日那列原来为空格的那笔资料删除?
另外,想请问一下,像这种以tab为分隔的txt档,在读取的时後,有没有什麽
办法可以可以将连在一起的概估年月,像是200912分割成2009 12,财务报
表公告日也是一样,想把连在一起的年月日分割,我原来有试着用栏位输入法,
可是好像原始档用tab分隔的档案,读取的时候栏位都会跑掉,之所以要分割是
因为要将概估年月是2009年的删掉,只想留下2010年的部份,虽然看起来原始
档案中已经分开列示的年月日等变数和财务报表公告日很像,但是因为我还要将
这个档案和另外一份合并,再以财务报表公告日为主去比对出另外一份档案中,
和这份档案财务报表公告日相同的资料,抓取前後20天的资料,所以在一开始
读取上述的原始txt档时,希望尽量能将可以比对的年月日分开列示,以方便进
行比对合并资料。
最後,想请问一下,由於原始TXT档中,同一家公司可能会出现两次同样的概估年度
,如果出现重复的情形,我只想保留第一笔资料,不知道用「NODUPKEY」的语法能不能
处理呢?
不好意思,麻烦各位了,谢谢^^
-----------------------------------------------------------------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.244.73
1F:推 west1996:1.原始档有missing的问题可以参考missover和truncover这 06/06 13:10
2F:→ west1996:两个option 06/06 13:10
3F:→ west1996:2.如果要切年月日的话在input这一句的变数指定方法要作 06/06 13:11
4F:→ west1996:修改,要跟SAS说每一个变数要从txt的第几栏读到第几栏, 06/06 13:11
5F:→ west1996:语法请参考help的「input」条目下的list 06/06 13:13
6F:→ west1996:3.在读取外部档阶段似乎不能去重复? 06/06 13:14
先谢谢大人的回答,可能是我表达的不是很清楚,针对大人第一个回答,在原始
档中空格的部份,我原来以为读进sas档中会是遗失值,这样我就可以针对遗失
值的部份,利用if语句删除那列,但是,实际操作後,发现sas读取的时候,原
始档中原来是空格的部份,sas会自动带入下一列的公司简码,这样一来,我就
不知道要如何能删除原始档中原来是空格的那列资料,因为原始档好像是用tab
去做分隔,我不太确定是不是因为这个原因所导致这样的情形,另外,我也有试
过大人所提的,在input时指定每一个变数要从第几栏到第几栏,可是,可能是
因为原始档不是以空格做分隔,而是以tab做分隔,我在原始档数的栏位,在 sas
读取後反而会全部跑掉,因为之前没碰过这样的情形,所以想请教各位一下,谢
谢^^
刚刚试着参考其他文章选取栏位的作法
试着写了一段程式
DATA d;
INFILE anndatee DELIMITER='09'X FIRSTOBS=2;
INPUT code name$ yr1 month1 date1 Quarter$ annodate$;
DROP yr1 month1 date1;
if length(annodate) eq 4 then delete;
yr2=substr(Quarter,1,4);
month2=substr(Quarter,5,2);
run;
可是我发现又出现以下问题:
1.在log视窗内,出现这段note
NOTE: 4859 records were read from the infile ANNDATEE.
The minimum record length was 26.
The maximum record length was 39.
SAS went to a new line when INPUT statement reached past the end of a line.
The data set WORK.D has 4609 observations and 6 variables.
虽然原始档有4859笔资料,但是读进sas档却只有4609笔???
2.原来设定Quarter及annodate变数时并未改成文字型态,但是采用substr的话却无法
产生我想要抓取的年月,所以後来改成文字型态进行处理,不知道这样作对不对,因为
如果要和另外一个档案以年月进行比较的话,势必要将该档案的年月改成文字型态,才
能进行比较。
不好意思,因为老师作业提供的原始档实在很怪,所以一直出现问题,还请各位多多包涵
谢谢^^
※ 编辑: joyce618 来自: 114.43.116.83 (06/06 23:47)
7F:推 west1996:先在infile後面加上missover和truncover这两个关键字看看 06/07 00:09
8F:→ west1996:比数会错就是因为原始资料里面有missing的原因,先把笔数 06/07 00:10
9F:→ west1996:和资料读对了,再来考虑後面的问题,不然也是白搭XD 06/07 00:10