详解使用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 相关文章推荐
javascript 页面只自动刷新一次
Jul 10 Javascript
jQuery中prependTo()方法用法实例
Jan 08 Javascript
jQuery实现流动虚线框的方法
Jan 29 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
Bootstrap基本插件学习笔记之按钮(21)
Dec 08 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
详解基于angular-cli配置代理解决跨域请求问题
Jul 05 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
May 01 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
javascript实现简单打字游戏
Oct 29 Javascript
vue 实现购物车总价计算
Nov 06 Javascript
一文了解JavaScript用Element Traversal新属性遍历子元素
Nov 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
使用PHP制作新闻系统的思路
2006/10/09 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
input的focus方法使用
2010/03/13 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
JS动态修改iframe内嵌网页地址的方法
2015/04/01 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
用python读写excel的方法
2014/11/18 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
党员承诺践诺书
2014/05/20 职场文书
广播体操比赛口号
2014/06/10 职场文书
银行贷款委托书范本
2014/10/11 职场文书
体育教师个人工作总结
2015/02/09 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
解析Java异步之call future
2021/06/14 Java/Android
mysq启动失败问题及场景分析
2021/07/15 MySQL