最近同事需要对一份报告进行整理,一共有80个报告约9000多行放在一个txt文件中。虽然每份报告的格式比较类似,但其中部分字段对应的数量依旧会有差别。所以真要靠人工来做,无疑会是一件费时费力的并且是很枯燥的工作。据说如果有了这个程序,可以减少60%的工作量!那么为了我以后的下午茶,自然应该去尝试一下不是么?
不过既然是费时费力又枯燥的工作,自然就应该交给代码去解决。毕竟,我坚信任何的科学技术就是为了让人类偷懒而存在的。那么就先切入正题,先上GitHub的项目地址。欢迎批评指点。
GitHub项目:report-maker
项目分析
既然准备要上代码了,作为一个狂热的前端爱好者,自然首选Node.js了。这一个项目主要的目的就是将txt文件中的内容按照一定的规则转化为固定格式的表格并导出为Excel。那么重点就可以分为下面两步了。
- Excel文件的生成
- txt内容的整理
1. Excel文件的生成
Excel文件自然是寻找可以依赖的模块了(毕竟我自己写不出来)。找了一圈,发现js-xlsx这一个模块。虽然看起来很复杂,但其实只要提供好表头和内容就可以,其余只是对于内容数据整理的固定模板。
相关教程可以参考下面这篇,讲的比较详细所以这里就不多做赘述了。
参考教程:使用node-xlsx进行excel文件的读写
2. txt内容的整理
解决了Excel导出的问题(不然就得换Py了呢),文档内容的整理便是这个项目最重要的问题了。最终整理的表格样式以及需要抽出的项目内容已经和同事确认过了。那么接下来就是如何整理了一个有着80个长短不一报告的文件了。
首先来看看文件的格式,整个文件的格式类似于下面这样。
Policy Name: policyName1 ……省略中间内容…… Policy Type: Standard (0) ……省略中间内容…… Client/HW/OS/Pri/CIT: Client1 Client/HW/OS/Pri/CIT: Client2 Client/HW/OS/Pri/CIT: Client3 Client/HW/OS/Pri/CIT: Client4 ……省略多个Client Include: /dir1 Include: /dir2 Include: /dir3 ……省略多个Include Schedule: Schedule1 Type: …… Schedule: Schedule2 Type: …… ……省略多个Schedule Policy Name: policyName2 ……省略中间内容…… ……
可以看出,每一个段落是以Policy Name为分界的。那么,利用fs.readFile将完整的文件读取进来,作为一个字符串使用split方法进行切割。具体代码如下:
fs.readFile(filePath, 'UTF-8', function (err, data) { if (err) throw err; // 对文件读取的数据进行处理,首先用 policyName 进行切割 var policyLists = data.split(config.splitRules.policyName); if (policyLists[0] === '\r\n') { policyLists.shift(); };
然后针对数组中每一个元素(一个段落)根据之前文件中所需要项目,使用正则表达式切提取出所需要的内容,然后将提取出的内容组成所需要的数据结构,具体代码如下。其中schedule项目中内容也并非在一行中,所以也同样使用上面的方法进行切割。而对于其他的项目,则通过正则表达式来进行内容的获取。
policyLists.forEach(function (policy) { var policyData = policyFormatter(config.splitRules.policyName + policy); excelData.push(policyData); }); /** * 对每一个policy进行整理 使其符合表格插入的形式 * @param {*} policy * { * policyName: String * client: []] * policyType: String * include: [] * schedule[] * scheduleResidence: String * } * */ function policyFormatter(policy) { var policyNameMatcher = new RegExp(config.splitRules.policyName + "([\\s\\w\\d\\-]*)\\r\\n"), clientMatcher = new RegExp(config.splitRules.client + "([\\s\\w\\d\\", "g"), policyTypeMatcher = new RegExp(config.splitRules.policyType + "([\\s\\w\\d\\(\\)\\-]*)\\r\\n"), includeMatcher = new RegExp(config.splitRules.include + "([\\s/\\w\\.\\\\:_\\"\\*]*)\\r\\n", "g"); var scheduleLists = policy.split(config.splitRules.schedule).slice(1), scheduleFormatLists = [], scheduleResidenceMatcher = new RegExp(config.splitRules.scheduleResidence + "([\\s\\w\\d\\-\\(\\)]*)\\r\\n"); scheduleLists.forEach(function (schedule) { var scheduleFormat = config.splitRules.schedule + schedule; scheduleFormatLists.push(scheduleFormat); }); // console.log(scheduleFormatLists); var results = { policyName: policy.match(policyNameMatcher)[1].trim(), client: policy.match(clientMatcher) ? policy.match(clientMatcher).join('').trim() : '', policyType: policy.match(policyTypeMatcher)[1].trim(), include: policy.match(includeMatcher).join('').trim(), schedule: scheduleFormatLists.join('').trim(), scheduleResidence: scheduleLists[0].match(scheduleResidenceMatcher)[1].trim() }; // console.dir(results); return results; }
主要逻辑处理完以后,把收集到的内容传给excel处理模块,导出成文件就能解决问题了。
不过似乎最终如果能导出为Word,似乎更好。看来还有新的改进空间还留着呢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
- 群星.1992-电视金曲巡礼VOL.2【EMI百代】【WAV+CUE】
- 廖昌永《情缘HQ》头版限量[低速原抓WAV+CUE]
- 蔡琴《老歌》头版限量编号MQA-24K金碟[低速原抓WAV+CUE]
- 李嘉《国语转调》3CD[WAV+CUE]
- 谭咏麟《爱的根源 MQA-UHQCD》2022头版限量编号 [WAV+CUE][1G]
- 江洋 《江洋原创琵琶作品专辑》[320K/MP3][118.08MB]
- 江洋 《江洋原创琵琶作品专辑》[FLAC/分轨][228.33MB]
- 《战舰世界》语音包文件夹位置介绍
- 《CSGO》送好友皮肤方法介绍
- 《山羊模拟器重制版》发售平台说明
- 刘德华2002-美丽的一天[香港首批大包装首版][WAV]
- 刘文正《金装刘文正不朽经典金曲》2CD(1995环星)][WAV+CUE]
- 周慧敏《94美的化身演唱会》宝丽金1995港版2CD[WAV+CUE]
- 娃娃.1997-精选180绝版冠军精丫滚石】【WAV+CUE】
- 娃娃.1997-精选290巅峰情歌经典【滚石】【WAV+CUE】