sas循环读取数据csv

sas循环读取数据csv,第1张

SAS循环读取数据CSV是指使用SAS程序来读取CSV文件中的数据。SAS程序可以使用INFILE语句来读取CSV文件中的数据,并且可以使用DO循环来循环读取每一行的数据。此外,SAS还提供了一个特殊的语句叫做INPUT,它可以帮助我们更加灵活地读取CSV文件中的数据。

一个sas程序一直在运行不出结果是什么问题?

可能是程序中存在死循环或者程序中的变量未定义,导致程序无法正确执行。另外,也可能是程序中的程序语句有语法错误,导致程序无法正确运行。

SAS(Serial Attached SCSI)资源管理器是一个工具,用于管理和监控SAS设备和连接。它可以帮助管理员诊断和解决与SAS设备相关的问题,并提供了有关SAS设备的详细信息,例如设备类型、速度、状态等。

SAS资源管理器通常可以显示以下内容:

设备列表:列出了所有连接到SAS控制器的设备,包括磁盘驱动器、磁带驱动器、RAID控制器等,并显示每个设备的状态、速度、型号等信息。

连接拓扑图:显示SAS控制器和连接的设备之间的拓扑结构,以及每个设备的物理连接方式和位置。

日志信息:记录了SAS控制器和设备的事件和错误信息,例如设备故障、传输错误等,并提供了详细的错误代码和描述。

性能和统计信息:提供了SAS控制器和设备的性能和统计数据,例如传输速度、I/O *** 作数、错误率等,以帮助管理员评估系统的性能和健康状况。

总之,SAS资源管理器提供了一个集中管理SAS设备和连接的工具,可以帮助管理员更好地了解和管理SAS系统

1)有两种注释方法,一种是号和;号;一种是用/ /表示,注意第二种注释方法不能放在第一列

2)错误 SAS程序通常将执行的错误标注为醒目的红色字母,你可能忘了分号,拼错了字母,按错了键盘,一个小错误会使得整个程序无法运行。当你看到红色部分多余黑色部分的时候,不要灰心。

3)SAS数据集也被叫做表、观测值也被叫做行、变量也被叫做列

4)字符变量的缺失值用空格表示,数值变量的缺失值用句号()表示

5)为变量和数据集命名时要遵守如下规则:

名字的长度要小于等于 32 个字节。

以字母或下划线开头。

可以包含字母、数字、或者是下划线,不能是%$!@。

可以是小写或大写字母,且不区分大小写。

6)SAS程序有两个基本模块:数据步和过程步。

一个典型的SAS程序,由数据步创建SAS数据集开始,再由过程步分析数据。这里有一个例子:数据步中将米转化成千米,过程步中输出结果

DATA step

DATA distance;

Miles = 2622;

Kilometers = 161Miles;

PROC step

PROC PRINT DATA = distance;

RUN;

数据步和过程步由语句组成(废话),一个过程少至1条语句、多至几百条。新手常犯的错误是将两种过程语句用混,只要记住数据步负责读取、修改数据,过程步负责分析数据、输出报告和效用函数,就不会犯错。

数据步由DATA语句开始:data+数据名。上例中数据步处理了名为distance的数据。为了读取外部数据、未加工的数据,数据步提供了DO LOOPS,IF-THEN/ELSE,以及一些数值和字符函数。数据步也可以按照你想要的方式合并数据集,包括联接(concatenation)和合并(match-merge)。

过程步由proc语句开始:proc+过程名(print、sort、means…),SAS过程步可以处理从数据储存、输出到方差分析、3D图表的一切 *** 作。

典型的程序是以DATA语句开头,输入或修改数据,然后将数据传递给PROC语句。但并不一定非要用这种模式来混合data和proc语句,你可以用任何顺序来排列data和proc两者的顺序,一个程序甚至可以仅有data语句或proc语句。

下面是data语句和proc语句的一些基本不同点:

DATA steps

begin wit DATA statements

read and modifu data

create a SAS data set

PROC steps

begin with PROC statements

perfrom specific analysis or function

produce results or report

7)数据步按照一行一行、一个观测值一个观测值的顺序执行

数据步“一行一行的执行”,这句话很好理解。但很多新手还是容易在这里出错,例如在没有创建一个变量之前就使用它,如果Z变量是X、Y两个变量组合的新变量,那么必须确定创建Z变量的语句在创建X、Y变量语句之后。

而“一个观测值一个观测值的执行”就不是那么容易理解。这意味着SAS先读取一个观测值,然后对这个观测值进行数据步的所有语句(当然也是一行一行的),然后再读取第二个观测值执行。每次执行SAS只有一个观测值。

8)SAS读取的数据的方法主要有以下几种类型:

直接输入;

从原始数据文件中创建一个SAS数据集(creating SAS data sets from raw data files);

将其他软件中的数据文件转换成SAS数据集;

直接读取其他软件的数据集;

9)内部原始数据

如果直接将数据输入SAS程序中,那么数据就是SAS内部数据。DATALINES是一个指示,告诉SAS下面跟着是数据行,直到分号结尾,这个分号可以另起一行,也可以接在数据的后面

10)外部原始数据

数据外SAS程序外部时,使用INFILE语句告诉SAS外部数据的文件名和存放路径,它在data语句之后,在INPUT语句之前。INFILE后面的文件名和路径要用引号,各种系统的引用方式各不同:

Windows: INFILE 'C:\Mydir\Presidentdat';

UNIX: INFILE '/home/mydir/presidentdat';

OpenVMS: INFILE '[usernamemydir]presidentdat';

OS/390 or z /OS INFILE 'MYIDPREDIDENDAT';

11)SAS日志

读取外部数据时,SAS日志会给一些很有用的信息,检查这些信息可以解决一些问题,比如对比INFILE语句读取的记录数和数据集中实际观测值,可以确定SAS是否正确的读取了数据

12)过长记录

在一些 *** 作环境中,SAS假定外部数据文件的记录长度为256或更少(记录长度是指某行中的字符数,包括空格),如果长度过长,SAS不能读取全部,此时需要在INFILE语句中使用LRECL=来指定长度,这个长度必须是数据中最长行的长度,如:

INFILE’c:\MyRawData\Presidentdat’LRECL=2000;

可以通过SAS日志来查看最大记录长度。

13)INPUT语句是数据步的一部分,它告诉SAS如何读取原始数据。使用List input来写input语句:在INPUT关键词之后列出变量名(按照变量在文件中出现的顺序),变量名长度在32个字节(含)以下,只能包含字母、下划线和数据,并必须以字母或者下划线开头。如果变量是字符串,后面要价“$”号,值与值之间至少有一个空格,语句要以分号结束。如: INPUT Name $ Age Height

;

这表明输入三个变量,其中name是字符串,age和height是数值变量

14)column input读取按固定列排列的原始数据

当一些原始数据的值之间没有空格分开,或者没用用句号代替缺失值时,list input就不能用。

但当每个变量的值都出现在数据行的相同位置时,并且变量值是字符串或者标准数值(只包含数据、小数点、正负号、和科学标注的E。逗号和日期都不能算)时,可以使用column input来读取

相比list input,column input有如下优势:

不要求变量值之间的空格;

缺失值可以直接用空格代替;

字符串中可以包含空格;

可以跳过不需要的变量。

Column input的input语句格式如下:input关键字后接变量名、再接变量的列位置(列位置是字符或者数值在一行中的位置)。字符串变量名后仍要用“空格+$”,变量名之间仍要用空格隔开。示例如下:

INPUT Name $ 1-10 Age 11-13 Height 14-18;

这个语句表明,Name变量,在行中占据第一列第十列,为字符串变量,age占据第11-13列,为数值变量,height占据第14-18列,数值变量。

15)informats读取非标准格式的原始数据

有时候原始数据不全是字符串或者数值,比如类似1,00,001这样包括逗号的字符串值,电脑就不能读取,其他诸如包含美元符号、十六进制、压缩十进制的数据都是非标准数据。SAS中,informats可以用来告诉电脑如何读取这样的数值。

日期是最普通的非标准数据,SAS informats会把类似10-31-2003或者31OCT03转换成数字,日期的起点为1960年1月1日,即这一天的数字为0。

Informats的三种普遍格式为:字符串、数值、日期。这三种格式的形式如下:

Character $informatw

Numeric informatwd

Date informatw

$是字符串、informats代表形式(比如日期的MMDDYY)、w是宽度、d是小数点的位数、最后是句号"",缺少句号会是的SAS把形式(如MMDDYY)当做变量名。一个简单formatted input的简单INPUT语句如下:

INPUT Name $10 Age 3 Height 51 BirthDate MMDDYY10;

Name 为字符串变量,占据10个宽度,即列位置为1-10;

age为数值变量,占据3个宽度,列位置从11-13;

height为数值变量,占据5个宽度,包括1为小数点和小数点本身,列位置从14-18(如1503)

最后是日期变量,从第19列开始,形式为MMDDYY

16)混合读取方式

每种数据读取方式都有其优势,list最简单,column和formatted虽然复杂但是不要求变量之间的空格,并且变量名中可以包含变量,而且formatted可以读取特殊的数据比如日期。SAS可以灵活的让你搭配不同的读取方式,以达到最大的方便。

有多种方式进行数据读取,下面额程序是方式之一:

DATA nation;

INFILE 'C:\MYrawdata\parkdat';

INPUT ParkName $ 1-22 STATE $ Year @40 Acreage COMA9;

PROC PRINT DATA = nation;

TITLE 'Selectes national parks';

RUN;

其中ParkName是column方式读取,State和Year是list方式读取,Acreage是formatted方式读取。

混合读取方式有时会遇到问题:SAS通过一个指示器标注位置,来读取原始数据的一行,但每种读取方式对指示器的使用稍有不同。List方式下,SAS自动找到非空格区域并开始读取;column方式下,SAS读取你所指定的特定位置;informatted方式下,SAS不理会指示器的标准,只是依次的读取。这时,就会需要列指示器@n,来人为的让SAS的读取直接跳至某列。

17)读取凌乱的原始数据

有的数据排列混乱,长度不一。这样的数据需要新的工具处理:@’character’ 列指示器和colon modifier。

@’character’ 列指示器 29中提到@column列指示器可以让SAS直接从某列开始读取数据。但有时候你不知道要读取的数据是从哪列开始,此时你只要知道要读取的数据的前面那个字符或单词即可。比如有一个关于狗的原始文件,你想要读取狗的品种号,但文件排列很凌乱,只知道品种号跟随在单词breed后面,那么可以用如下方式读取:Input @’Breed:’ DogBreed $;

colon modifier 由于input读取字符串变量默认为8个字符,因此在上例中如果狗的品种名(dogbreed)超过8个字符,则需要定义长度,定义为$length,在该长度中,空格也算在内。如果要使SAS读取过程中遇到空格则不再继续读取,则要在$length前面加冒号“:”。比如原始数据中有这么一行:

例子 web日志是凌乱数据的一个很好例子,下面是一个网站的web日志,数据开始于访问IP,后面有访问日期、访问文件名等信息

现在想要读取访问日期和访问的文件名,但是它们每行中所占据的列的位置都不同,而且文件名的长度每行都不一样,那么SAS读取这种文件通过如下方式:

DATA weblogs:

INFILE 'c:\dogweblogstxt';

INPUT @'[' AccessDate DATE11 @'GET' File:$20;

PROC PRINT DATA = weblogs;

TITLE 'Dog Care Web Logs';

RUN;

@’[’作为列指示器,告诉SAS读取[之后的内容,@’GET’告诉SAS读取GET之后的内容,由于文件名作为字符串变量,这里基本都会超过8个字节,因此后面附加:$20

18)跨行观测值的读取方式

一般原始文件中一行代表一个观测值,有时会出现一个观测值跨行的情况。由于SAS会自动转到下一行读取数据,直到读取这个观测的所有变量(input语句中给出),所以你需要告诉SAS什么时候不要换行,以便在日志中不出现SAS-went-to-a-new-line的暂停说明,此时需要在INPUT语句中加行指示器。(????)

行指示器,斜线/:告诉SAS跳至原始数据的第二行;#n:跳至第n行,n代表原始数据中某观测值的行数(#2则让SAS跳至某观测值的第二行),#n不能用来回跳。

例子 有一组关于温度的数据,temperaturedat第一行代表城市和州,第二行代表本日最高温和最低温,第三行代表史上最高温和最低温。

NOME AK

55 44

88 29

用如下的程度来读取这份数据:

DATA highlow;

INFILE 'c:\myrawdata\temperaturedat';

INPUT CITY $ STATE $

/ NormalHigh NormalLow

#3 RecordHigh RecordLow;

PROC PRINT DATA = highlow;

TITLE 'High and Low temperatures for july';

RUN;

Input后面告诉SAS读取第一行的city变量和state变量,斜线/告诉SAS移动到下一行的第一列,以便读取normalhigh和normallow。#3告诉SAS移动到第三行的第一列以便继续读取观测值的recordhigh变量和recordlow变量。这里/可以用#2代替,也可以用/代替#3。

19)当一行出现多个观测值时,可以在input语句结尾加一个停止符号@@

20)读取原始数据的部分观测值

:在SAS读取某一行观测值时,首先读取足够的变量以便决定是否需要保留此行的观测值。然后在input语句结尾加符号@,叫做a trailing at(called a trailing at),这告诉SAS先停在(hold)此行,同时用IF语句检测此观测值是否满足需要,如果是,那么可以再用一个input语句来读取现有的变量

@ vs @@ @的作用类似于@@,都是行停留指示符(line-hold specifiers),不同地方在于停留多久,@能使SAS停留到下一个input语句(也不换行),@@能使停留的时间到下一个data步

1将常用的宏写到sas文件中,并保存到合适的位置;

2找到:\Program Files\SAS Institute\SAS\V8\SASV8CFG文件,打开,在最后添加如下语句:

-autoexec ':\\\sas'

  保存,并关闭。

这样,在启动sas程序时,会率先执行sas文件,从而不必手工去执行所需要的宏。

1创建sas系统的一个快捷方式,然后点击右键->属性,在“起始位置”栏的修改为:

:\\\

2点击“应用”即可。

3特别注意,必须将路径:\\\下要执行的sas文件重命名为autoexecsas。这一点很关键!

1将常用的宏写到sas文件中,并保存到合适的位置;

2创建一个Txt文件,然后键入内容:

"C:\Program Files\SAS Institute\SAS\V8\sasexe"  -CONFIG "C:\Program Files\SAS Institute\SAS\V8\SASV8CFG" -autoexec ":\\\\sas"

  即方法二"目标"栏中的内容

3将该txt文件的后缀名修改为bat。双击该bat文件即自动打开sas程序,并自动执行指定位置的sas文件。

番外1:快捷方式这样设置可以指定SAS左上角的名称

"C:\Program Files\SASHome\SASFoundation\94\sasexe" -CONFIG "C:\Program Files\SASHome\SASFoundation\94\nls\zh\sasv9cfg" -awstitle "中文SAS"

番外2:快捷方式这样设置可以指定SAS使用最大内存

"C:\Program Files\SASHome\SASFoundation\94\sasexe" -CONFIG "C:\Program Files\SASHome\SASFoundation\94\nls\zh\sasv9cfg" -memsize MAX

SAS日志文件的Issue检查涉及多个日志文件的导入,导入的过程分为2个部分。 第一部分,获取特定路径下所有日志文件的名称(即文件地址);第二部分,获取文件地址后将文件导入SAS数据集

这两部分功能的实现,之前都有过介绍:

这篇文章将这两部分的内容整合到一起,演示路径如下:

程序思路是,使用 Dopen 函数打开特定路径,通过 Dnum 函数获取路径内的文件数目,基于此使用Do循环以及 Dread 函数进行读取文件名称,路径名称与文件名拼接可以获得文件路径。最后,对数据集进行筛选,只保留LOG文件。

程序运行结果如下:

前面文章介绍了2种导入方法,推荐使用 infile 语句。我手动将保存导入内容的长度设置为1000,这个值已经是比较大了。但是对于一些Log Issue,会将所有变量取值输出到日志中,这时候很容易造成内容截断。

不过,从检查Issue的角度看,可以在导入时筛选特定记录进行输出,截断不影响检查的判断结果。当然,也可以设置SAS读入文档的记录的最大长度32767,这大概率会避免内容的截断。

结果如下:

批量读入外部文档,是单个文档读入的延伸。文档读入SAS数据集,方便后续的检查处理。

感谢阅读, 欢迎关注!

若有疑问,欢迎评论交流!

以上就是关于sas循环读取数据csv全部的内容,包括:sas循环读取数据csv、一个sas程序一直在运行不出结果是什么问题、sas资源管理器显示的内容是等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10641799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存