2019年7月

前言

包括实习和入职,在SAS中国也已经待了有一段时间,经过这么久的熏陶我对SAS语言还不是很熟悉,平时的时间也没有太过深入的去进行学习SAS语言,前几天去中国银行客户现场,也总算接触到了一点SAS语言的皮毛,今天就算是一个引子吧,准备在博客开一个学习SAS语言的专栏,一是来记忆一下学到的知识点,俗话说好记性不如烂笔头,二是积累一下自己的技能,为后面的工作做铺垫,人生总是走在学习的路上。

SAS数据集、变量、常量、观测

  • 数据集:SAS可以管理的结构化数据,简单来说就是SAS软件认识的数据表,可以过程步用来数据处理,数据建模,如果说你的数据是外部文件保存,需要用SAS语言进行处理之后变成SAS数据集

    • 数据集的名称不超过32个字符
  • 变量:简单来说就是表头,数据表每一个数据项的名称就是一个变量

    • 类型:数值型和字符型(变量名后带$)
    • 特性:名称、类型、长度、输入格式、输出格式、标记
    • 最多有32个字符组成,由字母、数字、下划线组成
    • 长度默认为8
  • 常量:固定不变,跟其他编程语言类似
  • 观测:简单来说就是表的一行数据,在SAS里称之为观测

SAS导入数据的几个方法

  • 图形化界面导入(在数据不大的时候可以去用图形化界面进行导入,这里不过多赘述)
  • SAS代码导入

本次工作的目标

本次的工作目标是用SAS脚本把客户的外部数据导入到SAS软件中

SAS代码导入实例

  1. 导入内部数据,也就是sas代码中定义的数据,使用datalines关键字
data test;
    input name $ sex $ age;
    datalines;
    tom    男 23
    jim    女 24;
run;
  1. 导入txt文件数据
tom    男 23
jim    女 24

假设txt文件内容如上图所示,分隔符为空格

data test;
    infile "/home/sas/test.txt";
    input name $ sex $ age;
run;
tom/男/23
jim/女/24;

假设txt文件内容如上图所示,分隔符为/

data test;
    infile "/home/sas/test.txt" dlm='/';
    input name $ sex $ age;
run;

dlm这个参数可以指定分隔符,但前提是分隔符只有一个字符,如果分隔符是多个字符的话,则需要用dlmstr参数指定

姓名 性别 年龄
tom    男 23
jim    女 24

假设txt文件内容如上图所示,第一行有表的变量名称,我不想读进去,这时候用firstobs这个参数,指定SAS从哪一行开始读,同时obs这个参数还可以控制读到多少行

data test;
    infile "/home/sas/test.txt" firstobs=1;
    input name $ sex $ age;
run;
姓名 性别 年龄
tommmmmmmmmmmmmmmmmmmmmm 男 23
jimmmmmmmmmmmmmmmmmmmmmm 女 24

假设txt文件内容如上图所示,姓名已经超过了默认的8个长度,为了完整的导入数据,这时我们可以用length这个关键字,去进行定义这个变量的长度,或者在input语句中使用:去定义长度,所以代码可以是这样

data test;
    infile "/home/sas/test.txt" firstobs=1;
    length name $20.;
    input name $ sex $ age;
run;

或者是这样

data test;
    infile "/home/sas/test.txt" firstobs=1;
    input name:$20. sex $ age;
run;

在最后介绍一下另外的两个关键字missoverdsd

missover的作用是,如果txt文件一行数据不够时,告诉sas不要跳到下一行进行读取,简单来说就是保证读取数据不会串行

dsd的作用是,忽略用引号括起来数据中的分隔符,假设数据是用,进行分割,数据项是china,beijing,为保证该行数据能完整被读入,需要使用dsd

SAS执行Linux命令,并返回命令执行的结果

sas比较强大的地方就是可以无缝与shell进行集成衔接,这样你就可以使用shell获取到的结果进行数据处理与分析,可用到的场景非常之多,举一个例子,在sas进行io测试的时候,我们可以图形化界面显示出io测试的结果和数据,后期尝试写一个脚本出来,可以提高以后的工作效率。

 
示例代码如下:
filename cmd pipe "ls /home/sas";
data _null_;
infile cmd;
input result:$200.;
run;

未完待续

本次只是提到了txt文件,后续还有csv、excel文件,下次更新~~~

NCIAE_ Data_Structure

项目地址:https://github.com/TyrantJoy/NCIAE_Data_Structure

概述

​ 本项目是源自于北华航天工业学院大二数据结构科目的结业实训,整体来说较为简单,主要是数据结构中一些基础知识:例如线性表的删除、遍历、增加、排序;图的生成与迪杰斯特拉算法;文件的读写等。

​ 本项目在Dev C++环境下开发,clone本项目到本地之后,使用Dev C++打开Management System.dev文件,即可使用代码。

谈一谈为什么写这个东西

  • 致敬一下我的大学生活,这个实训是我当年的实训的项目,当时没有好好写,这次算是给老师交一个作业
  • 复习一下C语言和数据结构,好久不碰,害怕手生忘记

模块设计

1.初始化模块(init.cpp)

  • 初始化用户信息
  • 初始化图信息

2. 用户信息管理模块(user.cpp)

  • 增加用户
  • 删除用户
  • 查找用户
  • 修改用户

3. 排序模块(rank.cpp)

  • 冒泡排序

4. 辅助功能模块(tools.cpp)

  • 求平均步数
  • 求连续运动天数
  • 求星期
  • 数组转置
  • 打印菜单

5. 图结构模块(map.cpp)

  • 构建图
  • 迪杰斯特拉算法

数据结构设计

  • 用户信息结构体
typedef struct user
{
    char name[20];                // 用户昵称
    char phoneNumber[12];        // 用户编号
    char sex[2];                // 用户性别
    int record[7];                // 用户7天步数
    int age;                    // 用户年龄
    double averageSteps;        // 用户7天平均步数
    int motionDays;                // 用户连续运动天数
}user;
  • 图结构体
typedef struct graph
{
    char vexs[MAX][MAX];        // 地点名称
    int vexnum;                   // 节点数目
    float matrix[MAX][MAX];        // 地图边数
}Graph, *PGraph;

运行截图示例

main

user

rank

map