(实战)java解析湖北省自学考试专业计划

湖北省自考本科当下主要参考的就是 湖北省高等教育自学考试专业计划汇编2018年版 ,总共有86个专业,课程更是不在少数,手工录入变得不可行。

由于比较熟悉java,所以采用java来解析。java解析pdf主要是用PDFBox。常用的样例都是通过划定pdf上某一块区域来提取pdf文字的,所以我们只需要分析出需要提取的内容块即可。

从文件第14页开始,每个页面格式都是一致的。页面上比较重要的数据是专业名称,专业代码,专科/本科,以及课程代码,课程名称,课程学分。本文我们以现代农业技术(专科)和酒店管理(本科)为例。

// 添加图片 现代农业技术(专科), 酒店管理(本科)

从格式上能看到,专业名称专业代码块高度基本一致,并且距离页顶的高度基本不变,所以可以使用固定的块即可读取。课程信息块则是高度不一致,但是距离页顶是一致的,并且都在一页。

虽然课程信息块看起来很规整但是通过输出展示出来则是

###现代农业技术(专科)

课程名称 学分 备注
类别 序号 代码 学分小计
1 *03706 思想道德修养与法律基础 2
公
共 2 *12656 毛泽东思想和中国特色社会主义理论体系概论 4
基 3 *04729 大学语文 4 14/14
础 00018 计算机应用基础 2
课 4
00019 计算机应用基础(实践) 2
*02662 植物生理学 4
5
*02663 植物生理学(实践) 1
6 *02664 农业气象学 4
*02666 普通遗传学 4
7
专 *02667 普通遗传学(实践) 1
业
*02668 土壤肥料学 4
核 8 35/40
*02669 土壤肥料学(实践) 1
心
课 *02670 作物栽培学(二) 6
9
*02671 作物栽培学(二)(实践) 2
*02674 植物病虫害防治 4
10
*02675 植物病虫害防治(实践) 2
11 *06172 耕作学 7
选
可从同层次选考课程库中,或湖北省自学考试现行开考的其他同层次专业中,自主选择与本专业课程名称及代
考
码不相同的理论课程选考,达到学分规定要求。
课
其他要求 合格课程总学分不低于70学分,合格课程门数不少于15门。
说明:“*”表示原专业考试计划已设课程。
- 7 -

###酒店管理(本科)

1 *03708 中国近现代史纲要 2
公
2 *03709 马克思主义基本原理概论 4
共
基 3 *00015 英语(二) 14 16/30
础 选考不低于10学分;申
4 06779 应用写作学 5
课 请学位者英语(二)必考。
5 08118 法律基础 5
6 *06126 旅游人力资源管理 5 学位课程
专 7 *08424 酒店管理 5 学位课程
业 8 *08887 会展场馆经营与管理 6 学位课程
核
9 *00986 中国饮食文化 6 35/37
心
课 10 *03958 饭店服务心理学 5
11 *04929 旅游市场营销 5
12 *04932 酒店客房管理 5
13 00037 美学 6
推 14 03291 人际关系学 6
荐 15 03297 企业文化 6
选
考 16 03514 空间设计 3
课 17 11912 民俗文化与旅游 6
18 18968 客户服务 4
毕业 不计
19 99052 酒店管理毕业考核
考核 学分
1. 合格课程总学分不低于70学分,合格课程门数(不含毕业考核)不少于13门,毕业考核合格及
以上;申请学位者英语(二)必考。
其他要求
2. 选考课可从推荐选考课中选考,也可从同层次选考课程库中,或湖北省自学考试现行开考的同层
次其他专业中,自主选择与本专业课程名称及代码不相同的理论课程考试,达到学分规定要求。
说明:“*”表示原专业考试计划已设课程。
- 91 -

这样看起来非常不规则,但是我们需要的内容(课程代码,课程名称,学分)基本都在一列,这样我们就需要使用正则表达式来判断这一列是否包含我们需要的内容。课程代码基本都是固定为5位,学分一般是1到2位,所以对应正则表达式为 [.*\d{5}\s+.* \s+\d{1,2}.*],这样就能判断对应的行是否包含我们要提取内容的行。并且由于本科专业毕业考核和论文基本不计学分,所以针对这种情况可以设置正则表达式为[“.*\d{5}\s+.*”]。

// 代码样例
for (String line : lines) {
    if(ReUtil.isMatch(".*\\d{5}\\s+.* \\s+\\d{1,2}.*", line)) {
		Console.log(line);
	} else if(ReUtil.isMatch(".*\\d{5}\\s+.*", line)) {
		Console.log(line);
	}
}

// 输出:

1 *03706 思想道德修养与法律基础 2
共 2 *12656 毛泽东思想和中国特色社会主义理论体系概论 4
基 3 *04729 大学语文 4 14/14
础 00018 计算机应用基础 2
00019 计算机应用基础(实践) 2
*02662 植物生理学 4
*02663 植物生理学(实践) 1
6 *02664 农业气象学 4
*02666 普通遗传学 4
专 *02667 普通遗传学(实践) 1
*02668 土壤肥料学 4
*02669 土壤肥料学(实践) 1
课 *02670 作物栽培学(二) 6
*02671 作物栽培学(二)(实践) 2
*02674 植物病虫害防治 4
*02675 植物病虫害防治(实践) 2
11 *06172 耕作学 7

1 *03708 中国近现代史纲要 2
2 *03709 马克思主义基本原理概论 4
基 3 *00015 英语(二) 14 16/30
4 06779 应用写作学 5
5 08118 法律基础 5
6 *06126 旅游人力资源管理 5 学位课程
专 7 *08424 酒店管理 5 学位课程
业 8 *08887 会展场馆经营与管理 6 学位课程
9 *00986 中国饮食文化 6 35/37
课 10 *03958 饭店服务心理学 5
11 *04929 旅游市场营销 5
12 *04932 酒店客房管理 5
13 00037 美学 6
推 14 03291 人际关系学 6
荐 15 03297 企业文化 6
考 16 03514 空间设计 3
课 17 11912 民俗文化与旅游 6
18 18968 客户服务 4
19 99052 酒店管理毕业考核

这样可以明显看出,我们需要的内容列基本都在了,然后继续用正则表达式抽取出对应内容即可生成有规则的内容,方便我们做处理入库。

// 代码样例
for (String line : lines) {
    if(ReUtil.isMatch(".*\\d{5}\\s+.* \\s+\\d{1,2}.*", line)) {
        List<String> list = ReUtil.findAllGroup0("\\d{5}\\s+.* \\s+\\d{1,2}", line);
        Console.log(list.get(0));
    
    } else if(ReUtil.isMatch(".*\\d{5}\\s+.*", line)) {
        List<String> list = ReUtil.findAllGroup0("\\d{5}\\s+.*", line);
        Console.log(list.get(0));
    }
}

// 输出

03706 思想道德修养与法律基础 2
12656 毛泽东思想和中国特色社会主义理论体系概论 4
04729 大学语文 4 14/14
00018 计算机应用基础 2
00019 计算机应用基础(实践) 2
02662 植物生理学 4
02663 植物生理学(实践) 1
02664 农业气象学 4
02666 普通遗传学 4
02667 普通遗传学(实践) 1
02668 土壤肥料学 4
02669 土壤肥料学(实践) 1
02670 作物栽培学(二) 6
02671 作物栽培学(二)(实践) 2
02674 植物病虫害防治 4
02675 植物病虫害防治(实践) 2
06172 耕作学 7

03708 中国近现代史纲要 2
03709 马克思主义基本原理概论 4
00015 英语(二) 14 16/30
06779 应用写作学 5
08118 法律基础 5
06126 旅游人力资源管理 5 学位课程
08424 酒店管理 5 学位课程
08887 会展场馆经营与管理 6 学位课程
00986 中国饮食文化 6 35/37
03958 饭店服务心理学 5
04929 旅游市场营销 5
04932 酒店客房管理 5
00037 美学 6
03291 人际关系学 6
03297 企业文化 6
03514 空间设计 3
11912 民俗文化与旅游 6
18968 客户服务 4
99052 酒店管理毕业考核

这样一来内容就很好处理了,只需要根据空格分割为数组,数组前三个为课程代码,课程名称,课程学分。毕业考核设置为0学分即可。然后再加上专业代码,专业名称,专业层次就可以入库了。

更好的是把对应课程的考试方式也给提取出来,比如备注一栏带有 技能考核,或者课程名称上面带有(实践)的都属于实践类,不需要统考报考。还有对应专业的学位课程,都是很重要的信息。

本文完整代码查看: 解析专业计划代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值