java代码sql获取ResultSet 最后一条sql的数据 sql读取最后一行_原始数据


前一节我们介绍了通过菜单和proc步导入外部原始数据,虽然在实际中很多时候采取这种方式导入数据,但是从data步导入数据也是重要的方式,并且更加灵活。另外学习从data步导入原始数据也可以加深我们对SAS的理解。所以,我们有必要对此进行介绍。

data步导入的原始数据有两个呈现方式,一种是在程序编辑器中敲入的数据行,另外一种是存在外部文件中的数据。编辑器中敲入的数据行入下所示:


data weight;
   input PatientID $ Week1 Week8 Week16;
   loss=Week1-Week16;
   cards;
2477 195 177 163
2431 220 213 198
2456 173 166 155
2412 135 125 116
;
run;


上面程序中第一行data语句,为指定接纳数据行的SAS数据集,默认放在work中。input语句,指定读入的数据的变量名,$表示该列为字符型数据,无$则为数值型变量。cards;表示数据行的开始,数据行下面,run上面的分号表示读入数据行的结束。run;则表示执行程序。

存在外部文件中的数据,则是将上面的数据行存入到一个文件,比如TXT中。下面具体介绍data步导入方式。

  1. 列方式读入原始数据

方式读入原始数据,顾名思义,我们在读入数据时,要指定对应的列,比如


data scores;
infile cards truncover;
input name $ 1-10  sex $ 11  age 12-15  ;
cards;
Justine   F 12
Bob     M 13
;
run;


指定name是从1-10列,sex是11列,age从12-15列。列方式读入数据,原始数据可按任意顺序读取,直到满足指定的对应的列即可,比如你可以把sex $ 11放在name的前面。该方式读入数据,只要指定好对应的列,原始数据就可以不用空格分隔,甚至可以重复读取。列方式下,空格和点(.)均为缺失值,并且忽略读入数据的开头和结尾的空格。

2. 列表方式读入原始数据

列表方式读入数据中数据默认分隔符为空格,数据值之间要至少用1个空格隔开;跟列方式不同,它是按顺序读入数据;缺失值需要用小数点表示; 字符型数据默认长度为8个字符,当然可以用length,informat,attrib语句来规定长度。列表方式数据中有三个重要的修饰符,即“:”,&和~。

1)“:”


data;
input Univ : $12. Plc$  Zip ;
cards;
MIT Boston 100023 
TsinghuaUniv  Beijing  100084
;
run;


第一行data语句没有规定数据集,则默认创建的变量名为dataN(N取决于前面还有没有这么指定的情况,若没有则N=1,即data1,否则按次序增加1)。input中$12.定义的是字符型变量的长度为12,这是一个informat格式,12后面的“.”不能忽略。Univ后面的":"说明从第一列开始读,直到第一次遇到空格,或者到12个字符长度或者数据行结束,则读入结束。数据行第一行从第一列开始读入,由于首先遇到空格,则读入的为Univ为MIT,第二行中由于首先到达12个长度,则Univ为TsinghuaUniv。若Univ后没有指定变量长度,则第二行Univ读入的是Tsinghua,因为默认为8个字符,后面Plc继续从非空格列读入。

2)& 因为列表方式读入数据默认分隔符为空格,如果你导入数据的本身就包含空格就得用&修饰符。如下面例子:


data ;
input name & $12.  age;
cards;
Jiang Zhu   20
Annie Zheng    31
I. Altman      60
;
run;


由于name中本来就包含空格,则需要用&修饰符,并且不同列之间需要用两个以上的空格隔开。得到的SAS数据集如下:


java代码sql获取ResultSet 最后一条sql的数据 sql读取最后一行_sas sql 读取最后一行数据_02


3)~ 这个修饰符需要与infile语句的DSD选项一起才能发挥作用。DSD语句作用为:将默认分隔符改为逗号;对于连续的两个分隔符,中间按缺失值处理;去掉字符变量值的引号;将引号中的分隔符按正常字符处理。变量后加上~修饰符,可以保留字符变量值的引号。此外,~也有“:”的功能。如下面这个例子:


data topics2;
infile Cards dsd;
input speakers : $15. title ~ $40. location & $10.;
Cards;
Song, "Credit Derivatives", Room 329
Zhu, "Credit Risk Management", Room 406
;
proc print;
run;


输出结果为:


java代码sql获取ResultSet 最后一条sql的数据 sql读取最后一行_原始数据_03


~修饰符的加入,保留了title的引号。

3. 格式化方式读入原始数据

格式化方式输入是在变量后添加输入格式,比如:


input (name s1-s5)( $ 10. 4.);
input (name s1-s5)( $ 10. 4. 4. 4. 4. 4.);
input (name s1-s5)( $ 10. 5*4.);


n*格式 表示n个对应的变量均为同一种格式

4. 命名方式读入原始数据

命名方式读入数据如下所示:


data a;
input  date  yymmdd10. fullshr  stkcd=$  lstknm=$  ;
cards;
2001-01-18  1486553100  stkcd=600001 lstknm=邯郸钢铁
;
run;


需要注意的是一旦input语句中开始使用命名输入格式,则之后的变量均要采取这种命名方式读入数据,否则报错。当导入的数据本身有空格时,则需要将数据行中的列用至少两个空格隔开。

5. data步读入外部文件数据

文章一开头说过,data步导入的原始数据另外一种存放方式是存储在外部的文件中,读入该数据则需要额外用infile语句指定数据在电脑中的位置,例如:


data a;
infile 'd:resdat2pad.txt'; 
input  x $20.  y $20. z $30.;
run;


infile语句中一些比较重要的选项有:

dsd:分隔符默认为逗号;两个连续分隔符中间视为缺失,读入时去掉读入数据值的 引号

end=:定义一个变量标记是否到达文件的末尾,该变量值为1或者0,1则表示到达了文件结尾

Firstobs=: 规定从哪一行开始读入数据

obs=:规定要读入的行数

missover:阻止input从下一行读入数据,未赋值变量为缺失

stopover:当input语句到达记录行的结尾还有变量未赋值,则终止data步

truncover: 与missover类似

6. 指针控制

@n 表示指针到第几列 +n表示指针向右移动多少列;#n 表示指针到哪一行,/ 表示指针移动到下一行;

@可以让一个记录行被多个input语句读入,默认情况下每个input语句读入一个新的数据行,但在使用@可使指针位置不发生改变,没有一个新的数据行导入到缓冲区,下一个input语句继续导入同一个数据行。遇到下面几种情况释放记录行:一个空的input语句;一个不带@符号的input,下一个重复过程开始。

当一个记录行包含多个观测时,用@@,它表示数据步在进行下一次重复时,input语句导入同一个记录行,碰到一下情况释放记录行:指针达到记录的尾端;空的input语句;data步下一次重复开始时,带有@的input语句。