DATA SET (数据集)

1.什么是DATASET


        数据集是逻辑上相关的数据集合,主机上的数据、编写的程序源码存放于Data Set中。简而言之:数据集就是类似PC机中的“文件”。

        根据不同的组成结构,Dataset可分为不同的类型。

2. DATA SET的类型


       2.1 顺序数据集(Sequential Data Set)

        顺序数据集也被认为是 物理顺序集(Physical Sequential----PS)记录按写入的先后顺序排列,新记录被附加到数据集的尾部。在顺序数据集里,数据是按顺序存取的,想要获取记录5,系统必须先读取前4个记录。

        可以直接查看和修改,可以存放数据或者源码,可将其简单理解为PC上的根目录下的“ 文本文件


        2.2 分区数据集(Partitioned Data Set----PDS)

        将数据集分为按顺序组织的成员(Member),每个数据集可以有一个或多个成员,每个成员有唯一的名字,作为数据集的一部分存储在地址目录中。

        分区数据集打开以后,不需要查询整个数据集,用户就可以获取任何一个Member的记录,根据需要可以增加或删除任何一个Member记录。但只是删除了地址目录中的Member名,因此删除记录的空间是不能被重修使用的。

        分区数据集可以理解为PC机中的“文件夹”,里边可以存放多个Member,Member中可以存放数据或者源码,Member也类似PC上的“文本文件”。PDS需要压缩才能释放系统空间,Member的数量要受目录块数量的影响。


       2.3 扩展分区数据集(Partitioned Data Set Extended----PDSE)

         与PDS数据集类似,也是由多个Member组成,唯一区别是,PDSE的地址目录的大小是动态的,因此在增加或删除Member时,系统会自动分配或回收存储空间。在建立是不需指定目录块数量。


       2.4 VSAM 数据集(Virtual Sequential Access Method)

3. DATA SET的查看


        ISPF Primary Option Menu(即ISPF主画面)的命令行输入 3.4 即可进入Data Set List Utility(数据集列表功能画面),在Dsname Level中输入USERID或具体的文件名,按确认键即可进入文件列表。


        


        可以在DSLIST画面按F10或F11,将屏幕项翻到包含Dsorg的画面,通过Dsorg来区分


       


       


               文件类型        Dsorg

                PS       =>         PS

                PDS    =>         PO

                PDSE  =>         PO-E

                VSAM  =>         VS

4. DATA SET的打开


打开方式:

        Edit:(对应数据集操作的列表上的‘1’)编辑形式打开,可修改,保存。
        View:(对应数据集操作的列表上的‘2’)查看形式打开,可修改,但不能保存。
        Browse:(对应数据集操作的列表上的‘3’)浏览形式打开,不可修改。

打开数据集的操作步骤:

        1.选择希望打开的数据集,光标放到数据集名上按确认键
        2.在显示的数据集操作的列表上,选择希望操作数据集的方式(1/2/3)后按确认键
        3.如果是PDS进入目录后,看到目录下数据集列表,光标放到希望操作的文件名前的下划线上后按确认键打开数据集。


5. DATA SET的建立


DATA SET的命名基本原则:

        一个数据集名由多个段组成(一般至少2段,多采用3段式)

        段与段之间用一个分段符‘.’间隔

        每个段的命名:
        •长度不能超过8个字符
        •首位只能是字母(A—Z)或通配字符:@、#、$
        •除首位外,可以是字母(A-Z)、数字(0-9)、或通配字符@、#、$

        一个数据集的名字最大长度是44个字符,包括分段符‘.’


DATA SET的命名一般原则:

        一般系统会对一个USERID命名DATASET的首段权限作限制,所以,此段不能任意命名,一般为USERID名。

        第2段称为GROUP,原则可任意命名(但需遵从系统规范,体现在两点:
        1,上述每段命名规则;
        2,每个公司、每个项目会对二段进行约束,比如我们:USERID.COBOL专门存放COBOL程序、USERID.JCL专门存放编译器、执行器等等)

        第3段称为TYPE,如:data,text或编程语言名(如:COB),原则可任意命名(但需遵从系统规范)


新建DATA SET 数据集:


        在ISPF Primary Option Menu(即ISPF首画面)的命令行输入3.2即可进入DATA SET UTILITY


        

        DataSet Name里,输入三段名称,在Option里输入A,并按CTRL执行。


        

        设置DATASET的参数(PS数据集)


        


        设置DATASET的参数(PDS/PDSE数据集)

        


        按CTRL执行回到3.2界面,数据集创建成功。


参数含义:

        Management class:管理类别 指定数据集管理方面的信息(如备份,有效期)

        Storage class:存储类别 指定新分配数据集存储相关信息(如卷名,卷类型)

        Data class:数据类别 指定新分配数据集分配数据相关信息(如空间单位)

        Space unit:申请空间的单位:BLKS(块)、TRKS(扇区)、CYLS(柱面)

        Primary quantity:第一次分配空间的数量,按照指定空间单位分配

        Secondary quantity:每次增加分配空间数量,按照指定空间单位分配,最多15次

        Directory block:地址目录分配空间数量,PS必须为0,PDS必须大于0; 1个Directory block一般大约可存放5个Member 。Member 数量 = N*6-1(N: Directory block 数量)

        Record Format:记录格式: FB(定长、分块) 、U(格式未定)

        Record length:记录逻辑长度,必须大于0,一般为80

        Block size:分块大小,如果记录格式为F,分块大小必须为记录长度的整数倍。如果留空,系统会为数据集计算并分配效率最高的分块大小,所以,一般留空

        Data set name type:数据集类型,PS为空、分区数据集为PDS或LIBRARY(PDSE)

PDS/PDSE中添加MEMBER:


        命令区输入‘E’,数据集后输入‘(member名)’


        
  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现对Adult Data Set数据集进行智能k匿名处理,可以按照以下步骤进行: 1. 读取Adult Data Set数据集,将其存储在内存中。 2. 将数据集中的每个属性进行分类,分为敏感属性和非敏感属性。 3. 对敏感属性进行k匿名处理,确保每个属性值至少有k个相同的值。 4. 对非敏感属性进行一般化处理,将每个属性值映射到一个较小的集合中。 5. 合并处理后的敏感和非敏感属性,并输出最终的数据集。 以下是一个用C语言实现对Adult Data Set数据集进行智能k匿名处理的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LINE_LEN 1024 struct record { char age[16]; char workclass[32]; char fnlwgt[16]; char education[32]; char education_num[16]; char marital_status[32]; char occupation[32]; char relationship[32]; char race[16]; char sex[16]; char capital_gain[16]; char capital_loss[16]; char hours_per_week[16]; char native_country[32]; }; struct anonymous_record { char age[16]; char workclass[32]; char fnlwgt[16]; char education[32]; char education_num[16]; char marital_status[32]; char occupation[32]; char relationship[32]; char race[16]; char sex[16]; char capital_gain[16]; char capital_loss[16]; char hours_per_week[16]; char native_country[32]; char sensitive_attribute[32]; }; void k_anonymity(struct record *data, int num_records, int k); void generalization(struct record *data, int num_records); int main() { struct record data[MAX_LINE_LEN]; struct anonymous_record anon_data[MAX_LINE_LEN]; int num_records = 0; int k = 5; FILE *fp = fopen("adult.data", "r"); if (fp == NULL) { printf("Failed to open file!\n"); return 1; } char line[MAX_LINE_LEN]; while (fgets(line, MAX_LINE_LEN, fp) != NULL) { sscanf(line, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]", data[num_records].age, data[num_records].workclass, data[num_records].fnlwgt, data[num_records].education, data[num_records].education_num, data[num_records].marital_status, data[num_records].occupation, data[num_records].relationship, data[num_records].race, data[num_records].sex, data[num_records].capital_gain, data[num_records].capital_loss, data[num_records].hours_per_week, data[num_records].native_country); num_records++; } fclose(fp); generalization(data, num_records); k_anonymity(data, num_records, k); for (int i = 0; i < num_records; i++) { strcpy(anon_data[i].age, data[i].age); strcpy(anon_data[i].workclass, data[i].workclass); strcpy(anon_data[i].fnlwgt, data[i].fnlwgt); strcpy(anon_data[i].education, data[i].education); strcpy(anon_data[i].education_num, data[i].education_num); strcpy(anon_data[i].marital_status, data[i].marital_status); strcpy(anon_data[i].occupation, data[i].occupation); strcpy(anon_data[i].relationship, data[i].relationship); strcpy(anon_data[i].race, data[i].race); strcpy(anon_data[i].sex, data[i].sex); strcpy(anon_data[i].capital_gain, data[i].capital_gain); strcpy(anon_data[i].capital_loss, data[i].capital_loss); strcpy(anon_data[i].hours_per_week, data[i].hours_per_week); strcpy(anon_data[i].native_country, data[i].native_country); strcpy(anon_data[i].sensitive_attribute, data[i].marital_status); // 随便选一个敏感属性 } // 输出最终的数据集 for (int i = 0; i < num_records; i++) { printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n", anon_data[i].age, anon_data[i].workclass, anon_data[i].fnlwgt, anon_data[i].education, anon_data[i].education_num, anon_data[i].marital_status, anon_data[i].occupation, anon_data[i].relationship, anon_data[i].race, anon_data[i].sex, anon_data[i].capital_gain, anon_data[i].capital_loss, anon_data[i].hours_per_week, anon_data[i].native_country); } return 0; } void k_anonymity(struct record *data, int num_records, int k) { // 对敏感属性进行k匿名处理 for (int i = 0; i < num_records; i++) { int count = 0; for (int j = 0; j < num_records; j++) { if (strcmp(data[i].marital_status, data[j].marital_status) == 0) { count++; } } if (count < k) { // 找到一个和当前记录的敏感属性值不同的记录,将其敏感属性值替换为当前记录的敏感属性值 for (int j = 0; j < num_records; j++) { if (strcmp(data[i].marital_status, data[j].marital_status) != 0) { strcpy(data[j].marital_status, data[i].marital_status); break; } } } } } void generalization(struct record *data, int num_records) { // 对非敏感属性进行一般化处理 for (int i = 0; i < num_records; i++) { // 年龄一般化 if (atoi(data[i].age) < 25) { strcpy(data[i].age, "under-25"); } else if (atoi(data[i].age) < 45) { strcpy(data[i].age, "25-44"); } else if (atoi(data[i].age) < 65) { strcpy(data[i].age, "45-64"); } else { strcpy(data[i].age, "65+"); } // 工作类型一般化 if (strcmp(data[i].workclass, "Private") == 0) { strcpy(data[i].workclass, "Non-government"); } else { strcpy(data[i].workclass, "Government"); } // 学历一般化 if (strcmp(data[i].education, "Bachelors") == 0 || strcmp(data[i].education, "Masters") == 0 || strcmp(data[i].education, "Doctorate") == 0) { strcpy(data[i].education, "Higher-Education"); } else { strcpy(data[i].education, "Lower-Education"); } // 工作时长一般化 if (atoi(data[i].hours_per_week) < 20) { strcpy(data[i].hours_per_week, "<20"); } else if (atoi(data[i].hours_per_week) < 40) { strcpy(data[i].hours_per_week, "20-39"); } else { strcpy(data[i].hours_per_week, ">=40"); } } } ``` 注意:这只是一个简单的示例代码,实际应用中还需要考虑更多因素,例如如何选择敏感属性、如何进行一般化处理等。同时,为了保护隐私,应该在处理后的数据集中删除原始数据,只保留处理后的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值