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

最近同事需要对一份报告进行整理,一共有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,似乎更好。看来还有新的改进空间还留着呢。

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

(0)

相关推荐

  • Nodejs获取网络数据并生成Excel表格

    Nodejs的模版中有很多关于Excel表格的,这里我简单介绍一下我使用过的一个模块的使用. 首先,先安装Excel的模块: npm install node-xlsx 然后,在代码中引入模块: var xlsx = require('node-xlsx'); 最后,获取数据并写入Excel: var fs = require('fs'); var xlsx = require('node-xlsx'); var ajax = require('./ajax.js'); start(); fun

  • Node.js实现Excel转JSON

    一直在做一个关于网上选课的系统,选用了时下比较流行的node.js.今天在想怎么把学生或者老师的信息导入进去,涉及数量比较多一点,我手边又正好有一部分excel的表格.就想把excel转成json然后倒入到mongodb中去. 搜了下网上的资料,有不少.大部分都是C#或python的,要吗自己编译,要吗各种缺库运行不了.google了一下发现居然node里面是有这个module的.网址是https://www.npmjs.com/package/xls-to-json.. 步骤的话大概记录下吧:

  • nodejs导出excel的方法

    本文实例讲述了nodejs导出excel的方法.分享给大家供大家参考.具体如下: nodejs 对查询数据生成excel并下载,采用方式先生成本excel文件,然后再下载:通过比较采用excel-export插件代码如下: excel.js代码: var extend = require("extend"); var fs = require("fs"); var excelExport = require('excel-export'); var guid=req

  • Node.js利用js-xlsx处理Excel文件的方法详解

    简介 本文介绍用 Node.js 中的 js-xlsx 库来处理 Excel 文件. js-xlsx 库是目前 Github 上 star 数量最多的处理 Excel 的库,功能强大,但上手难度稍大.文档有些乱,不适合快速上手. 本文对 js-xlsx 库进行一定的总结,并提供几个实用的例子供读者测试,学习,交流. 安装 $ npm install xlsx 一些概念 在使用这个库之前,先介绍库中的一些概念. workbook 对象,指的是整份 Excel 文档.我们在使用 js-xlsx 读取

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

    最近同事需要对一份报告进行整理,一共有80个报告约9000多行放在一个txt文件中.虽然每份报告的格式比较类似,但其中部分字段对应的数量依旧会有差别.所以真要靠人工来做,无疑会是一件费时费力的并且是很枯燥的工作.据说如果有了这个程序,可以减少60%的工作量!那么为了我以后的下午茶,自然应该去尝试一下不是么? 不过既然是费时费力又枯燥的工作,自然就应该交给代码去解决.毕竟,我坚信任何的科学技术就是为了让人类偷懒而存在的.那么就先切入正题,先上GitHub的项目地址.欢迎批评指点. GitHub项目

  • 详解在node.js中require方法的加载规则

    require 方法的加载规则 优先从缓存中加载 核心模块 路径形式的模块 第三方模块 一.优先从缓存中加载 main.js:执行加载a.js模块 require('./a') a.js:执行加载b.js模块,并输出a被加载了 require('./b') console.log('a.js 被加载了') b.js:输出b被加载了 console.log('b.js 被加载了') 结果: 可以看出:main去加载a.js,然后a在去加载b.js过程中,并没有打印两次 a.js被加载,Node会直

  • 详解阿里Node.js技术文档之process模块学习指南

    模块概览 process是node的全局模块,作用比较直观.可以通过它来获得node进程相关的信息,比如运行node程序时的命令行参数.或者设置进程相关信息,比如设置环境变量. 环境变量:process.env 使用频率很高,node服务运行时,时常会判断当前服务运行的环境,如下所示 if(process.env.NODE_ENV === 'production'){ console.log('生产环境'); }else{ console.log('非生产环境'); } 运行命令 NODE_EN

  • 详解把Node.js项目部署到阿里云服务器(CentOs)

    最近用node.js开发了一个web项目,开发完打算先部署到我自己买的阿里云学生服务器上,让客户先试用下网站.不知道如何把node.js项目部署到阿里云服务器,在问了飞哥哥之后,在网上找了下教程,部署成功.把教程整合了一下,做下分享. 服务器 服务器选择了阿里云学生服务器:9.92一个月,适合用来个人开发测试. 配置: 系统:CentOS6.5 64位(Linux系统的一种) 配置环境配置服务器环境 1.在阿里云管理控制台把云服务器实例启动 2.登入服务器:用Putty 或 Xshell(我使用

  • 详解用Node.js写一个简单的命令行工具

    本文介绍了用Node.js写一个简单的命令行工具,分享给大家,具体如下: 操作系统需要为Linux 1. 目标 在命令行输入自己写的命令,完成目标任务 命令行要求全局有效 命令行要求可以删除 命令行作用,生成一个文件,显示当前的日期 2. 代码部分 新建一个文件,命名为sherryFile 文件sherryFile的内容 介绍: 生成一个文件,文件内容为当前日期和创建者 #! /usr/bin/env node console.log('command start'); const fs = r

  • 详解从Node.js的child_process模块来学习父子进程之间的通信

    child_process模块提供了和popen(3)一样的方式来产生自进程,这个功能主要是通过child_process.spawn函数来提供的: const spawn = require('child_process').spawn; const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data'

  • 详解用Node.js实现Restful风格webservice

    Restful风格的WebService正在渐渐取代传统的SOAP, Java 也有很多Restful的框架,很方便简洁,Jersey,restlet,甚至SpringMVC也可以,不得不说Rest让人从Web转型到WebService更容易和方便,当然深入Restful的理论还是发现比较复杂的,但是,开发和理论并不需要那么的贴合,有时候伪Restful更直观,靠谱些. 但是,作为很帅的Node.js怎么可以不和同样帅气的Restful相结合呢!?对于我们这种无视理论的开发者来说,Restful

  • 详解基于Node.js的微信JS-SDK后端接口实现代码

    做了一个网站,放到线上,用微信打开,点击分享,可是分享后发给朋友的链接卡片是微信默认自带的,如下: 这标题,描述以及图片是默认自带的,丑不说,分享给别人还以为是盗号网站呢,而接入微信的JSSDK后,分享可以自定义内容,如下: 我承认,虽然这分享的标题和内容也并不正经,但这不妨碍我表达我们可以通过微信JSSDK定义分享内容,接下来我们将一步一步从零实现JSSDK从后端Node.js的接入. 成为测试公众号开发者 登录测试公众号后台 首先我们需要在微信公众平台申请测试接口,地址:https://mp

  • 详解本地Node.js服务器作为api服务器的解决办法

    在看react-native教程的时候,遇到要在手机端调试,需要api服务器,但是由于Node.js自己就作为服务器,没有apache怎么解决这个问题,用apache和nginx也可以解决,但是有点复杂,我们就使用node已有的模块解决这个问题. //服务器端的代码 var express = require('express'); var app = express(); // set up handlebars view engine var handlebars = require('ex

  • 详解基于 Node.js 的轻量级云函数功能实现

    导语 在万物皆可云的时代,你的应用甚至不需要服务器.云函数功能在各大云服务中均有提供,那么,如何用"无所不能"的 node.js 实现呢? 一.什么是云函数? 云函数是诞生于云服务的一个新名词,顾名思义,云函数就是在云端(即服务端)执行的函数.各个云函数相互独立,简单且目的单一,执行环境相互隔离.使用云函数时,开发者只需要关注业务代码本身,其它的诸如环境变量.计算资源等,均由云服务提供. 二.为什么需要云函数? 程序员说不想买服务器,于是便有了云服务: 程序员又说连 server 都不

随机推荐