2017.4.9- 4.9
前言:
本周完成的工作主要是整理上周从智联招聘网站上采集到的数据。
① 工资 ==> 字符串转化,并计算均值
② 招聘人数 ==> 字符串转化,并计算均值
③ 统计工种数量与对应招聘需求量
④ 统计公司信息与公司招聘工种与对应需求
笔记导航
- 正则表达式学习
- 招聘信息整理
具体笔记
1. 正则表达式
正则表达式完整整理
常用的几个:
/\d+/ 含有一个或一个以上的数字
/[^\d+]/ 不包含数字
/[xyz]/ 出现xyz中的任意一个字符
使用示例:
String.match(regExp)返回值:如果匹配返回匹配到的字符串,否则返回null
//判断字符串与正则表达式是否匹配:
String.match(regExp) !== null
==> true 说明匹配
==> false 说明不匹配
2. mongodb模块的学习
npm包中的mongodb,是mongodb的官方驱动。
官方API文档
//mongodb的find函数返回的结果是游标,与mongoose的使用方法不同,需要通过toArray()转换
db.collection.find({}, function(err, doc){
//返回的doc是游标,需通过toArray完成转换
doc.toArray(functiong(err, data){
//data 才是document
})
})
//update方法与mongoose的update用法相同
db.collection.updateOne({queryConditons},{updateOperations},{upsert:true},function(err,doc){
//doc就是更新后的记录
})
3. 数据库信息整理
- 工资转换
exports.reformSalary = function (cb) {
var test = db.collection('cooo');
var regExp1 = /\d+\-\d+[元/月]/;
var regExp2 = /^\d+[元/月]/;
var regExp3 = /[面议]/;
//对所有不包含数字的记录进行操作
test.find({},function (err, doc) {
doc.toArray(function (err, data) {
if (data.length > 0) {
async.mapLimit(data, 1, function (job, callback) {
if ((job.salary).match(regExp1) !== null) { //工资格式为区间,则计算中间值
var salary = job.salary.replace('元/月', '');
var lowerLimit = parseInt(salary.replace(/\-\d+/, ''));
var upperLimit = parseInt(salary.replace(/\d+\-/, ''));
salary = (lowerLimit + upperLimit) / 2;
test.updateOne({_id: job._id}, {$set: {salary: salary}}, function (err, data) {
if (err) {
console.log(err);
} else {
console.log('success to update the average!');
callback(null, 'one');
}
})
} else if ((job.salary).match(regExp2) !== null) { //把工资格式为具体金额的纪律,转换成数字类型
var salaryNum = parseInt((job.salary).replace(/[^\d]+/,''));
test.updateOne({_id: job._id},{$set: {salary: salaryNum}},function (err, res) {
if (err){
console.log(err);
}else {
console.log('success to update string to number!');
callback(null, 'one');
}
})
} else if ((job.salary).match(regExp3) !== null) { // 把价格为"面议"的招聘记录都修改成0
test.updateOne({_id: job._id},{$set: {salary: 0}}, function (err, doc) {
if (err) {
console.log(err);
} else {
console.log("success update 面议 to 0!");
callback(null, 'one');
}
});
} else {
callback(null, 'one');
}
}, function (err, res) {
console.log('salary values have been all REFORMED!');
cb(null, 'end');
})
}else {
cb(null, 'end');
}
})
})
}
- 需求人数转换
//把招聘人数属性值转变为Number类型
exports.reformDemandNum = function () {
var JOB = db.collection('copy');
var jobtype = db.collection('jobtype');
JOB.find({}, function (err, data) {
if (err){
console.log(err);
}else {
data.toArray(function (err, jobs) {
var jobTypeDemand = [];
async.mapSeries(jobs, function (job, callback) {
//当属性值为X人时,取数字;当属性值为若干时,取0
var numReq = (job.numReq).match(/\d+[人]/)!== null ? parseInt((job.numReq).replace('人','')) : 0;
JOB.updateOne({_id: job._id}, {$set:{numReq:numReq}}, function (err, data) {
if (err){
console.log(err);
}else {
// console.log('update numReq successful');
jobTypeDemand[job.jobType] = typeof(jobTypeDemand[job.jobType])==='undefined'?numReq:jobTypeDemand[job.jobType]+numReq;
callback(null, 'one');
}
});
},function (err, res) {
console.log(jobTypeDemand);
console.log("更新人数成功");
})
})
}
})
}
- 工种数量分析
//统计工种,记录工种名称与该工种的需求量
exports.selectDistinctJobtype = function () {
var job = db.collection('copy');
var jobType = db.collection('jobtype');
job.distinct('jobType', function (err, data) {
if (err) {
console.log(err);
} else {
async.mapLimit(data, 1, function (jobType, callback) {
job.find({jobType: jobType}, function (err, doc) {
if (err) {
console.log(err);
} else {
doc.toArray(function (err, data) {
var staff = 0;
for(var i = 0; i < data.length; i++){
staff += data[i].numReq;
}
var cmp = {
jobType: jobType,
companyDemand: data.length,
staffDemad: staff,
}
callback(null, cmp);
})
}
})
}, function (err, res) {
jobType.insertMany(res, function (err, data) {
if (err) {
console.log(err);
} else {
console.log("insert jobType successfully");
}
})
});
}
})
}
- 公司数据分析
//统计共有多少个招聘公司,记录公司名称与公司的岗位需求量
exports.selectDistinctCompany = function () {
var job = db.collection('copy');
var company = db.collection('company');
job.distinct('company', function (err, data) {
if (err) {
console.log(err);
} else {
async.mapLimit(data, 1, function (company, callback) {
job.find({company: company}, function (err, doc) {
if (err) {
console.log(err);
} else {
doc.toArray(function (err, data) {
var staff = 0;
for(var i = 0; i < data.length; i++){
staff += data[i].numReq;
}
var cmp = {
companyName: company,
typeDemand: data.length,
staffDemand: staff,
}
callback(null, cmp);
})
}
})
}, function (err, res) {
company.insertMany(res, function (err, data) {
if (err) {
console.log(err);
} else {
console.log("insert cmp successfully");
}
})
});
}
})
}
网友评论