详解使用Node.js 将txt文件转为Excel文件


Posted in Javascript onJuly 05, 2017

最近同事需要对一份报告进行整理,一共有80个报告约9000多行放在一个txt文件中。虽然每份报告的格式比较类似,但其中部分字段对应的数量依旧会有差别。所以真要靠人工来做,无疑会是一件费时费力的并且是很枯燥的工作。据说如果有了这个程序,可以减少60%的工作量!那么为了我以后的下午茶,自然应该去尝试一下不是么?

不过既然是费时费力又枯燥的工作,自然就应该交给代码去解决。毕竟,我坚信任何的科学技术就是为了让人类偷懒而存在的。那么就先切入正题,先上GitHub的项目地址。欢迎批评指点。

GitHub项目:report-maker

项目分析

既然准备要上代码了,作为一个狂热的前端爱好者,自然首选Node.js了。这一个项目主要的目的就是将txt文件中的内容按照一定的规则转化为固定格式的表格并导出为Excel。那么重点就可以分为下面两步了。

  1. Excel文件的生成
  2. 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\\?\\-\\.]*)\\r\\n", "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,似乎更好。看来还有新的改进空间还留着呢。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 回车事件实现代码
Aug 23 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
JS控制输入框内字符串长度
May 21 Javascript
js获取字符串最后一位方法汇总
Nov 13 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
Nov 24 Javascript
AngularJS 中的事件详解
Jul 28 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
Aug 24 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
Jun 10 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
May 19 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
Jan 27 Javascript
AngularJS实现进度条功能示例
Jul 05 #Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 #Javascript
angularjs2中父子组件的数据传递的实例代码
Jul 05 #Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 #jQuery
jQuery常见面试题之DOM操作详析
Jul 05 #jQuery
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 #Javascript
微信小程序学习之数据处理详解
Jul 05 #Javascript
You might like
图解上海144收音机
2021/03/02 无线电
在PHP中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP打印输出函数汇总
2016/08/28 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
Python运维开发之psutil库的使用详解
2018/10/18 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
python函数与方法的区别总结
2019/06/23 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
python怎么调用自己的函数
2020/07/01 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
python中实现词云图的示例
2020/12/19 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
2014年基建工作总结
2014/12/12 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS