《SAS编程基础知识》PPT课件

上传人:工**** 文档编号:567891349 上传时间:2024-07-22 格式:PPT 页数:95 大小:521.04KB
返回 下载 相关 举报
《SAS编程基础知识》PPT课件_第1页
第1页 / 共95页
《SAS编程基础知识》PPT课件_第2页
第2页 / 共95页
《SAS编程基础知识》PPT课件_第3页
第3页 / 共95页
《SAS编程基础知识》PPT课件_第4页
第4页 / 共95页
《SAS编程基础知识》PPT课件_第5页
第5页 / 共95页
点击查看更多>>
资源描述

《《SAS编程基础知识》PPT课件》由会员分享,可在线阅读,更多相关《《SAS编程基础知识》PPT课件(95页珍藏版)》请在金锄头文库上搜索。

1、第第2章章 SAS编程基础编程基础清华大学经管学院清华大学经管学院 朱世武朱世武SAS语言组件语言组件 SAS 文件文件 由SAS创建、储存、管理的文件就是SAS文件。所有的SAS文件都保存在SAS逻辑库中。 最常用的SAS文件: l SAS数据集l SAS目录册 SAS外部文件外部文件 SAS不能直接识别的数据文件称为外部文件。外部文件一般用于储存数据。外部文件一般用来储存:l 要读入SAS数据文件的原始数据l SAS程序语句l 过程步输出DBMS文件文件SAS软件可以和其它数据库产品进行数据文件转换。 SAS语言元素语言元素SAS语言由语句、表达式、选项、格式、以及和其它编程语言名称类似的

2、函数组成。SAS有两种语句l 数据步l 过程步SAS文件系统文件系统 SAS逻辑库由一组SAS文件组成。SAS软件系统的信息组织有两层,第一层是SAS逻辑库,第二层是SAS文件。SAS逻辑库是一个逻辑概念,本身不是物理实体,它对应的实体是操作系统下一个文件夹或几个文件夹中的一组SAS文件。 逻辑库逻辑库 逻辑库名与引用逻辑库名与引用SAS文件文件 逻辑库名是SAS名,长度不能超过8个字节。如SAS逻辑库:ResDat, SASHELP, SASUSER, WORK等。建立SAS逻辑库的方法:l 用菜单操作;l 用LIBNAME语句。语句格式:LIBNAME libref SAS-data-li

3、brary 语法说明:Libref 逻辑库名 SAS-data-library 逻辑库对应的物理地址Engine 引擎名称(缺失时为默认引擎)例例2.1 用用LIBNAME语句创建语句创建SAS逻辑库。逻辑库。Libname ResDat d:ResDat;多个个文件夹创建一个多个个文件夹创建一个SAS逻辑库:逻辑库:Libname a (d:resbd,d:resfin);例例2.2 引用非临时库的SAS文件时必须使用两级命名方式,而引用临时库的SAS文件时,可以直接使用文件名,效果等同于work.文件名。data=ResDat.Idx000001;临时库和永久库临时库和永久库临时逻辑库临时

4、逻辑库是指它的内容只在启动SAS时存在,退出SAS时内容完全被删除。系统缺省的临时逻辑库为WORK.永久逻辑库永久逻辑库是指它的内容在SAS关闭对话之后仍旧保留,直到再次修改或者删除。SAS系统中除了WORK以外的逻辑库都是永久库。库引擎库引擎库引擎是一组规定格式向逻辑库读写文件的内部指令。利用库引擎SAS系统可以直接访问其它SAS版本创建的SAS文件和外部数据库格式的数据文件。 每个SAS逻辑库都对应一个库引擎。库引擎功能包括:l 读取和写入数据;l 列出库中的文件;l 删除和重命名文件。SAS通过不同库引擎读写不同格式的文件。每个SAS引擎都有着自身的运行特性。比如l 运行由旧版本SAS软

5、件生成的文件;l 读取由其它软件生成的数据库文件;l 存储和访问硬盘或者tape上的文件;l 决定文件中的变量和观测如何放置;l 将文件从物理位置地址读取放入到内存;l 在不同的操作系统之间传输SAS文件。数据集数据集 SAS数据集有两类:l SAS数据文件l SAS数据视图SAS数据文件同时描述信息和存储数据值。SAS数据视图并不实际存储数据,而只是一个查询语句。class是数据视图class1是数据文件变量观测SAS数据集组成部分包括:l 描述信息;l 数据值。数据文件数据文件SAS数据文件是包含描述信息和数据值的SAS数据集。一般来说,SAS数据文件又分为:l 普通的SAS数据文件:SA

6、S格式的数据文件。l 接口数据文件:以其它数据软件格式储存数据的数据文件。SAS提供对应的引擎来对这些文件中的数据进行读取和编写,如ORACLE DB2,SYBASE,ODBC,BMDP,SPSS和OSIRIS。虽然数据文件与视图文件在应用时没有任何区别。但这两虽然数据文件与视图文件在应用时没有任何区别。但这两者之间也有一定的差异。者之间也有一定的差异。l 前面已经提到二者最大的不同就是数据文件实际储存数值,视图只是包含表的描述信息以及一组用来读取数据视图只是包含表的描述信息以及一组用来读取数据的查询语句,并不实际存储数据的查询语句,并不实际存储数据。l 数据文件是静态的,而视图则是动态的。l

7、 SAS数据文件可以被索引,索引可以使SAS在搜索数据的时候变得更快。而SAS视图不能被索引。l 数据视图数据视图 SAS数据视图就是用来从其它文件中读取数据的一种SAS文件。它只包括数据集的描述信息,如数据类型、变量长度等,再加上如何从其它文件中提取数据所要求的信息。 SAS视图一般分为两种:视图一般分为两种:l Native View, 由数据步或者SQL过程创建。l Interface View, 由SAS/ACCESS软件创建。Interface View可以读写其它数据库管理系统(DBMS)中的数据库,如DB2或 ORACLE数据库等。数据视图的使用优势数据视图的使用优势l 可以使用

8、连接多个表的视图来合并数据集。l 数据视图可以节省大量的空间。l 数据视图可以保证读取的数据集永远都是最新的。l 更改一个数据视图只需要改变这个视图的查询语句。l 使用SAS/CONNET软件,视图可以将多个不同主机电脑上的数据文件整合,以整体的形式呈现。数据步视图数据步视图数据步视图包含用于从多个数据源中读取数据的数据步程序,这些数据源包括:l 原始数据文件;l SAS数据文件;l PROC SQL视图;l SAS/ACCESS 视图;l DB2,ORACLE,或者其它DBMS数据。语法格式:语法格式:Data 数据集名称/ view=数据集名称; SAS语句.;Run;例例2.3 创建数据

9、步视图。创建数据步视图。Data Resdat.class1/view=Resdat.class1;set Resdat.class;run;1 data Resdat.class1/view=Resdat.class1;2 Resdat.class1;3 run;NOTE: DATA STEP 视图已保存在文件 Resdat.class1 中。NOTE: 存储的 DATA STEP 视图无法在不同的操作系统下运行。日志中信息PROC SQL视图视图PROC SQL视图为一个带有名称的PROC SQL查询。它可以读写的数据源同数据步视图。proc sql;create view resdat.

10、e as select * from resdat.class;quit;日志中信息:4 proc sql;5 create view resdat.e as select * from resdat.class;NOTE: SQL 视图 resdat.E 已定义。6 quit;存储编译的存储编译的DATA步程序步程序语句格式 DATA data-set-name(s) / PGM=stored-program-name ();data-set-name数据集名称stored-program-name存储编译的DATA步程序名称password-option给DATA步程序名称分配一个密码so

11、urce-option 存储或编译源码 语法说明目录册文件目录册文件SAS目录册文件是特殊的SAS文件,用来存放多种不同种类的信息文件。这些信息文件都很小,每个信息文件都被称为一个条目(entry), 条目有多种不同的类型。一些目录条件包含一些系统信息如功能键定义信息。SAS语言元素语言元素 数据集选项数据集选项数据集选项用在SAS数据集名称后的括号中,多个选项之间用空格隔开。括号中的数据集选项可以对数据集进行如下操作:l 重新命名变量;l 选择需要的观测;l 输出数据集中保留或删除的变量;l 数据集加密。语句格式:Data-set-name(Data-set-options)(option-

12、1=value-1)例例2.4 数据集选项举例。数据集选项举例。data scores(keep=team game1 game2 game3);/*scores中只保留team,game1game2 game3这4个变量)proc print data=new(drop=year); /*去掉变量year*/set old(rename=(date=Start_Date);/* 将date改名*/输入和输出格式输入和输出格式 输出格式输出格式format是SAS用来确定如何输出或写出数据值的指令,用FORMAT控制数据值在输出时所使用的格式。输入格式输入格式informat是SAS用来确定如

13、何将数据读入变量的指令。如果在输入或输出数据集的过程中没有设定变量的输入和输出格式,系统会自动使用原数据集中的这个变量原有的输入输出格式。语句格式:format. informat. 格式说明:$指定为字符格式,如果该项空缺,则默认是数值格式format规定有效SAS输出格式Informat规定有效SAS输入格式w设定输入输出的长度,一般来说是数据所占的列的数目d设定数值数据中小数点的位数函数和函数和CALL子程序子程序 SAS函数函数对数据参数进行计算处理并返回一个值。大多数函数所使用的参数是由用户提供的,一小部分函数使用系统提供的参数。 CALL子程序子程序用来改变变量值,或执行一些系统功

14、能。CALL子程序类似于函数,但是不能在赋值语句中使用,所有的SAS CALL子程序都只能被CALL语句使用。 语句语句SAS语句就是一系列关键词、SAS名称、算符以及特殊字符的组合。所有的SAS语句以分号结尾。SAS语句一般分为数据步语句与过程步语句,以及可以用在SAS程序任何地方的全局通用语句。KEYWORD parameteroptions;关键词关键词 参数 选项;其中:粗体-必须按显示形式书写的关键词;白正体-用户提供的信息;-括号内的信息可选;|-任选。参数PARAMETER不是任选项,不用括号,OPTIONS是选项关键词。例例2.5 有效的有效的SAS语句。语句。data dat

15、a1; /* data为关键词,data1为SAS名 */data _null_; /* _null_为SAS名 */put name $ 8.; /* put为关键词,name为SAS名,$8.为输出格式*/format date yymmdd10.;proc means data=ResDat.class; /* proc为关键词,means为过程名 */infile “d:ResDatclass.txt”;do I=1 to 100;x=y+1; sumx+x;run;SAS系统选项系统选项 系统选项用来控制SAS的运行方式,如SAS系统启动,硬件软件的连接,SAS程序的运行等。 语句格

16、式:OPTIONS option(s); option 设定一个或多个系统选项,任何系统选项都有一个默认设置。例例2.6 设定选项设定选项OPTIONS obs=5;/*取数据集前五个观测*/Data one;Set ResDat.class;Run;表达式表达式 表达式由一系列操作符和操作对象构成,产生一个目标值。使用表达式可以对变量作变换和赋值,创建新变量,计算新数值以及控制条件语句的运行等。操作对象有:l 变量;l 常数。操作符包括:l 算术算符;l 比较算符;l 逻辑算符;l SAS函数;l 括号。SAS常数常数 SAS常数是SAS系统可以识别的一些固定值。数值常数数值常数 例例2.7

17、 数值常数。数值常数。1, 5, 1.23, 1.2E23, 2E4 , 20000数值常数可以有多种格式展示。标准格式标准格式:1,01,+1,-1,1.1;科学计数法:科学计数法:1.1e11, 1.2e-12;十六进制格式:十六进制格式:1cx,12x,9x字符常数字符常数 例例2.8 引用带引号的字符常数。引用带引号的字符常数。name=TOM”S;name=”TOMS”; /*例中,两语句等价。*/要注意的是,字符常数是由引号括起来的,但是字符变量的名称则没有引号,也就是说字符常数不能作为字符变量的名称。日期时间常数日期时间常数 例例2.9 引用日期时间常数。引用日期时间常数。1ja

18、n2000d; 01jan00d;9:25t; 18jan00:9:27:25dtif begin=01JAN2000d then end=31DEC2000d; SAS算符算符SAS算符是一些符号,其作用是进行计算、比较等。算术算符算术算符 例例2.10 算术算符应用。算术算符应用。data;X=3.5*2.5; put X=;Y=9+1/3;put Y=;X=.;Y=1+X;put Y=; /*Y也是缺失值*/run;输出结果:X=22.917651494Y=9.3333333333Y=.比较算符比较算符 例例2.11 比较算符应用。比较算符应用。if xy then c5;else c1

19、2;比较算符经常出现在IF语句里。比较准则:l 数值和字符都可以比;l 结果为真赋值1,假赋值0;l 字符值从左到右逐个按ASCII码排列序列进行比较;l 缺失值参加比较时,它比任何有效值都小。逻辑算符逻辑算符 算符等价形式含义AND与| OR或 NOT非其它算符其它算符 :连连接接字字符符算算符符“|”例例2.12 连接多个变量和常数。连接多个变量和常数。data;set ResDat.lstkinfo;result=%a(|stkcd|,|stknm|); put result;run;SAS变量变量 SAS变量分为数值变量和字符变量。数值变量数值变量数值变量是SAS系统以浮点(float

20、ing-point)方式存储的数据变量,数值变量包括日期和时间。数值变量的值只能是数值。 字符变量字符变量字符变量可以由阿拉伯字母、数字0-9以及其它一些特殊字符组成。字符变量的值可以是字符、字母、特殊字符和数值。字符变量名后跟一个美元号($)表示该变量是字符型而不是数值型。变量属性变量属性 SAS变量的属性包括:长度、输人输出格式和标签。未设定属性的变量在它们第一次出现时由系统给出。变量的长度是指存贮变量值的字节数。缺省长度为8个字节。变量的输人格式是指SAS系统读人变量值的方式。变量的输出格式是指SAS系统展现变量值的方式。变量的标签是指变量名的描述性标识,它至多可用256个字符。创建变量

21、创建变量 使用赋值语句使用赋值语句 Data a; x=1; run;/*数据集a中有个变量x,值为1*/使用使用INPUT语句语句 Data b; Input x $; Datalines; Aaa ; Run;使用使用FORMAT 或或 INFORMAT语句语句 Data b; Set b; Informat y $9.; Run;以类似的方式创建变量的还有LENGTH语句,ATTIRB语句。变量类型转换变量类型转换 字符自动转换为数值字符自动转换为数值 例例2.15 字符自动转换为数值。字符自动转换为数值。data;X=1; /*X为数值变量 */Y=10; /*Y为字符变量 */X=Y

22、; /*将字符变量赋值给一个数值变量时,自动将字符变量Y转换为数值变量 */ run;data;X=1; /*X为数值变量 */Y=10; /*Y为字符变量 */Z=X+Y; /*算术表达式中有字符变量时,自动将字符变量Y转换为数值变量 */run;data;X=1; /*X为数值变量 */Y=10; /*Y为字符变量 */if X1996; /* Where语句中使用Year函数 *run;用函数处理多变量可以简化程序用函数处理多变量可以简化程序例3.3 用与不用SAS函数时的程序。不用SAS函数。totx=xl+x2+x3+x4+x5+x6+x7+x8+x9+x10; if totxy t

23、hen least=totx;else least=y;使用SAS函数。leastmin(sum(of x1-x10),y);例中,两段程序的结果相同,第二段只有一个语句,非常简单。函数自变量函数自变量自变量类型: 变量名; 常数; 函数; 表达式。例3.4 函数及其自变量类型举例。 自变量个数: 有些函数不需要自变量,有些只需要一个自变量,有些函数有多个自变量。SAS9.1中,自变量个数不能超过32767。 如果函数的自变量是表达式,在函数被调用之前,所有表达式自变量首先计算。自变量表示法:当函数有多个自变量时,必须用逗号分隔开。自变量名缩写方法: 函数名(OF变量名1变量名n ) 例3.5

24、 正确与错误的表示方法。例3.6 数组元素自变量的缩写方法。array y10 y1-y10; /*定义数组y10 */x=sum (of y*);z=sum (of y1-y10);例中,两个SUM函数的表示法是等价的。 函数结果函数结果通常函数的结果由其自变量的属性决定: 自变量是字符时结果变量为字符; 自变量是数值时结果变量为数值。PUT函数是一个例外,它不管自变量是什么类型,其结果总是字符值。根据缺省规则,对大多数函数来说,数值目标变量的长度是8,字符目标变量的长度没有缺省规则 。目标变量长度不用缺省规则的函数见课本表3.1。用用PUT语句在语句在LOG窗口显示窗口显示函数值函数值例3

25、.7 显示概率值和分位数。data;Y=probnorm(1.96); /* 标准正态分布小于1.96的概率 */put Y;q1=tinv(.95, 2); /*自由度为2的t分布的0.95分位数*/q2=tinv(.95, 2, 3); /*自由为2,非中心参数为3的t分布的0.95分位数*/put q1= q2=;run;0.9750021049q1=2.9199855804 q2=13.894376071日期时间函数日期时间函数 SAS日期和时间存贮标准是以1960年1月1日0时0分0秒为起点,然后以相应的间隔记时。如1960年1月1日9时0分,按日记的数值就是0,按小时记的数值就是9

26、。1960年1月2日0时0分,按日记的数值就是1,按小时记就是24等。 由于日期函数是一类非常重要的函数,特别是对金融数据处理和金融计算,借助日期函数可以极大提高效率。应用举例应用举例 例3.8 计算两个日期之间的天数。data _null_;sdate=01jan2002d;edate=01jan2003d;actual=datdif(sdate, edate, act/act); /*按每个月的实际天数算 */days360=datdif(sdate, edate, 30/360); /*按每个月30天计算 */put actual= days360=;run;data _null_;ac

27、tual=datdif(01jan2002d, 01jan2003d, act/act);days360=datdif(01jan2002d, 01jan2003d, 30/360);put actual= days360=;run;例中,两段程序的结果一样。actual=365, days360=360.例3.10 以日为单位计算当前日期的天数。data;x=date (); y=today();put x= y=;run;例中,DATE()和TODAY()结果一样,都是返回当天的天数。当然,也可以用一定的日期格式表示它们。data;x=date (); y=today();format x

28、 y yymmdd10.;put x= y=;run;结果显示:x=17232 y=17232结果显示:x=2007-03-07 y=2007-03-07例3.12 计算日期值所在的年季月以及处于某月的第几天。data a;set ResDat.stk000001 (obs=10);keep date year qtr month day;year=year (date);qtr=qtr (date);month=month (date);day=day (date);proc print noobs;run; Date year qtr month day1991-01-02 1991 1

29、1 21991-01-03 1991 1 1 3 1991-01-04 1991 1 1 4 1991-01-05 1991 1 1 5 1991-01-07 1991 1 1 7 1991-01-08 1991 1 1 8 1991-01-09 1991 1 1 9 1991-01-10 1991 1 1 10 1991-01-11 1991 1 1 11 1991-01-12 1991 1 1 12例3.14 将日期时间值换算为以秒计数的计算方法。data;mdy=mdy (08,18,2001); put mdy=;format mdy yymmdd10.;hms=hms (21,50,

30、51); put hms=;x=21*60*60+50*60+51; put x=;dhms=dhms (date (), 21,50,51); put dhms=;dhms=dhms (15263,21,50,51); put dhms=;y=15263*24*3600+x; put y=;run;结果显示:mdy=2001-08-18hms=78651x=78651dhms=1347832251dhms=1318801851y=1318801851 概率分布函数概率分布函数标准正态分布标准正态分布 PROBNORM(X)计算标准正态分布随机变量小于X的概率。 例3.15 计算三个特殊的正态

31、概率值。data;P1=probnorm(0);P2=probnorm(1.96);P3=probnorm(2.5758293);put P1= P2= P3=;run;结果显示:P1=0.5P2=0.9750021049P3=0.9949999999样本统计函数样本统计函数 样本统计函数在实际中的用处不是很大,因为应用这些函数时,一定要把样本的观测数据放在同一行才可以,现实中样本的观测数据却往往是按一列一列排的。一般情况下,求变量X的样本统计函数值时要用别的方法。样本统计量函数共有15个。 均值均值 MEAN(of xl-xn) 或 MEAN(x,y,z, )计算非缺失自变量的算术平均。自变

32、量中至少有一个非缺失值。 求和求和 SUM(of xl-xn) 或 SUM (x1,x2, )计算自变量的和。要求有两个以上自变量。 方差方差 VAR(of xl-xn) 或 VAR (x1,x2, )计算自变量中非缺失值的方差。要求至少有两个自变量。 随机数函数随机数函数 SAS系统提供11种随机数函数。由于随机数函数是进行随机模拟的基础,这里我们通过例子,给出每种随机数发生程序,供读者参考。 正态分布正态分布 例3.27 用函数RANNOR产生正态分布随机数。data RV;retain _seed_ 0; /*retain 赋初值0给_seed_*/mu=0;sigma=1; do _i

33、_ = 1 to 1000;Normal1 = mu + sigma * rannor(_seed_); /*均值为mu,标准差为sigma*/output;end;drop _seed_ _i_ mu sigma;run;Normal1-0.9721-0.70001-2.34007-0.10939-0.01883-0.641540.8187660.221107例3.28 用函数NORMAL产生正态分布随机数。data RV;retain _seed_ 0;mu=0;sigma=1;do _i_ = 1 to 1000;normal1 = 0 + 1 * normal(_seed_);/*均值

34、为mu,标准差为sigma*/output;end;drop _seed_ _i_;run;均匀分布均匀分布 例3.29 用函数RANUNI产生均匀分布随机数。data RV1; retain _seed_ 0; a=-1; b=2; do _i_ = 1 to 1000;uniform1 = a + (b-a) * ranuni(_seed_); /*区间a, b上的均匀分布*/output;end;drop _seed_ _i_;run;例3.30 用函数UNIFORM产生均匀分布随机数。data RV1; retain _seed_ 0; a=-1; b=2; do _i_ = 1 to

35、 1000;uniform1 = a + (b - a) * uniform(_seed_); /*区间a, b上的均匀分布*/output; end; drop _seed_ _i_;run; 随机数函数自变量随机数函数自变量SEED 随机数函数使用一个自变量SEED来选择产生随机数的初始种子值,由这个值开始产生随机数流。自变量SEED的取值和初始化类型如下表列出。 表3.4 SEED取值与初始化类型 产生随机数的过程中,自变量SEED的值保持不变,种子则不断变化。所以,用随机函数产生随机数时,不能控制种子的值,因此也不可能控制初始化之后的随机数。如果要控制随机数流,就要用随机数函数的CAL

36、L子程序。 SAS CALL 子程序子程序 SAS系统提供一系列CALL子程序,用于产生随机数或执行其它的系统功能,详见表3.5,3.6。 随机数子程序随机数子程序 用随机数子程序可以更好地控制种子流和随机数流。除NORMAL和UNIFORM这两个函数之外,所有随机数函数都有一个相应的子程序。CALL语句激活随机数子程序的格式为:CALL routine (seed, variate);选项说明: 使用CALL子程序时,首先要对SEED变量赋初值。同时产生几个随机数流时,用CALL子程序比用随机函数的效果更好。因为,用随机数函数同时创建的多个随机数变量都属于同一个随机数流。 例3.38 使用随

37、机函数产生两个随机数变量属于同一个随机数流。data RV;retain seed1 seed2 161321804;do I=1 to 5;x1= ranuni(seed1);x2= ranuni(seed2);output;end;options nocenter;proc print;run;例中,SEED1和SEED2的初值相同,但X1和X2的第一个观测值却不相同。因为,SEED2的值在这里不起作用,X2的第一个值并不是由SEED2产生的,而是产生第一个X1后一个新种子的结果。所以,这里产生的两个随机数变量属于同一个随机数流。 结果显示:结果显示:Obs seed1 seed2 I x

38、1 x2 1 161321804 161321804 1 0.43617 0.64888 2 161321804 161321804 2 0.34138 0.42729 3 161321804 161321804 3 0.43237 0.63834 4 161321804 161321804 4 0.74690 0.89710 5 161321804 161321804 5 0.13630 0.19031例3.39 使用CALL子程序产生两个独立的种子流和随机数流。data RV;retain seed3 seed4 135279821;do I=1 to 5;call ranuni(seed

39、3, X3);call ranuni(seed4, X4);output;end;proc print;run;例中,产生两个独立的种子流和随机数流。因为SEED3=SEED1,所以X3表示的随机数流就是X1和X2组成的随机数流。使用CALL语句时随时可以看到当前的种子值,用随机数函数则看不到。 结果显示:结果显示:Obs seed3 seed4 I X3 X41 936674311 724196333 1 0.43617 0.337232 1393460745 1733883844 2 0.64888 0.807403 733112270 1200908019 3 0.34138 0.559224 917607517 674688435 4 0.42729 0.314185 928513130 1646762308 5 0.43237 0.76683

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号