詳解使用Node.js 將txt文件轉(zhuǎn)為Excel文件
最近同事需要對一份報告進(jìn)行整理,一共有80個報告約9000多行放在一個txt文件中。雖然每份報告的格式比較類似,但其中部分字段對應(yīng)的數(shù)量依舊會有差別。所以真要靠人工來做,無疑會是一件費(fèi)時費(fèi)力的并且是很枯燥的工作。據(jù)說如果有了這個程序,可以減少60%的工作量!那么為了我以后的下午茶,自然應(yīng)該去嘗試一下不是么?
不過既然是費(fèi)時費(fèi)力又枯燥的工作,自然就應(yīng)該交給代碼去解決。畢竟,我堅信任何的科學(xué)技術(shù)就是為了讓人類偷懶而存在的。那么就先切入正題,先上GitHub的項目地址。歡迎批評指點(diǎn)。
GitHub項目:report-maker
項目分析
既然準(zhǔn)備要上代碼了,作為一個狂熱的前端愛好者,自然首選Node.js了。這一個項目主要的目的就是將txt文件中的內(nèi)容按照一定的規(guī)則轉(zhuǎn)化為固定格式的表格并導(dǎo)出為Excel。那么重點(diǎn)就可以分為下面兩步了。
- Excel文件的生成
- txt內(nèi)容的整理
1. Excel文件的生成
Excel文件自然是尋找可以依賴的模塊了(畢竟我自己寫不出來)。找了一圈,發(fā)現(xiàn)js-xlsx這一個模塊。雖然看起來很復(fù)雜,但其實(shí)只要提供好表頭和內(nèi)容就可以,其余只是對于內(nèi)容數(shù)據(jù)整理的固定模板。
相關(guān)教程可以參考下面這篇,講的比較詳細(xì)所以這里就不多做贅述了。
參考教程:使用node-xlsx進(jìn)行excel文件的讀寫
2. txt內(nèi)容的整理
解決了Excel導(dǎo)出的問題(不然就得換Py了呢),文檔內(nèi)容的整理便是這個項目最重要的問題了。最終整理的表格樣式以及需要抽出的項目內(nèi)容已經(jīng)和同事確認(rèn)過了。那么接下來就是如何整理了一個有著80個長短不一報告的文件了。
首先來看看文件的格式,整個文件的格式類似于下面這樣。
Policy Name: policyName1 ……省略中間內(nèi)容…… Policy Type: Standard (0) ……省略中間內(nèi)容…… 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 ……省略中間內(nèi)容…… ……
可以看出,每一個段落是以Policy Name為分界的。那么,利用fs.readFile將完整的文件讀取進(jìn)來,作為一個字符串使用split方法進(jìn)行切割。具體代碼如下:
fs.readFile(filePath, 'UTF-8', function (err, data) {
if (err) throw err;
// 對文件讀取的數(shù)據(jù)進(jìn)行處理,首先用 policyName 進(jìn)行切割
var policyLists = data.split(config.splitRules.policyName);
if (policyLists[0] === '\r\n') {
policyLists.shift();
};
然后針對數(shù)組中每一個元素(一個段落)根據(jù)之前文件中所需要項目,使用正則表達(dá)式切提取出所需要的內(nèi)容,然后將提取出的內(nèi)容組成所需要的數(shù)據(jù)結(jié)構(gòu),具體代碼如下。其中schedule項目中內(nèi)容也并非在一行中,所以也同樣使用上面的方法進(jìn)行切割。而對于其他的項目,則通過正則表達(dá)式來進(jìn)行內(nèi)容的獲取。
policyLists.forEach(function (policy) {
var policyData = policyFormatter(config.splitRules.policyName + policy);
excelData.push(policyData);
});
/**
* 對每一個policy進(jìn)行整理 使其符合表格插入的形式
* @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;
}
主要邏輯處理完以后,把收集到的內(nèi)容傳給excel處理模塊,導(dǎo)出成文件就能解決問題了。
不過似乎最終如果能導(dǎo)出為Word,似乎更好??磥磉€有新的改進(jìn)空間還留著呢。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 手把手教你用Node.js爬蟲爬取網(wǎng)站數(shù)據(jù)的方法
- node.js讀取Excel數(shù)據(jù)(下載圖片)的方法示例
- Node.js利用js-xlsx處理Excel文件的方法詳解
- Node.js實(shí)現(xiàn)Excel轉(zhuǎn)JSON
- Nodejs實(shí)現(xiàn)爬蟲抓取數(shù)據(jù)實(shí)例解析
- nodeJs爬蟲獲取數(shù)據(jù)簡單實(shí)現(xiàn)代碼
- nodejs爬蟲抓取數(shù)據(jù)之編碼問題
- nodejs爬蟲抓取數(shù)據(jù)亂碼問題總結(jié)
- Nodejs技巧之Exceljs表格操作用法示例
- 使用ExcelJS快速處理Node.js爬蟲數(shù)據(jù)
相關(guān)文章
開箱即用的Node.js+Mysql模塊封裝實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了開箱即用的Node.js+Mysql模塊封裝實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Node.js中Bootstrap-table的兩種分頁的實(shí)現(xiàn)方法
這篇文章主要介紹了Node.js中Bootstrap-table的兩種分頁的使用方法,需要的朋友可以參考下2017-09-09
Node.js+pm2+ssh2模塊實(shí)現(xiàn)簡單的自動化部署腳本
本文將介紹如何使用Node.js和ssh2模塊實(shí)現(xiàn)一個簡單的部署腳本,將本地的項目文件上傳到遠(yuǎn)程服務(wù)器上,我們將使用dotenv模塊來管理環(huán)境變量,以及child_process模塊來執(zhí)行命令行操作2023-10-10
NodeJS感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài)
NodeJS可以感知和控制自身進(jìn)程的運(yùn)行環(huán)境和狀態(tài),也可以創(chuàng)建子進(jìn)程并與其協(xié)同工作,這使得NodeJS可以把多個程序組合在一起共同完成某項工作,并在其中充當(dāng)膠水和調(diào)度器的作用,和進(jìn)程管理相關(guān)的API單獨(dú)介紹起來比較枯燥,這里從一些典型的應(yīng)用場景出發(fā)2024-01-01
node學(xué)習(xí)筆記之讀寫文件與開啟第一個web服務(wù)器操作示例
這篇文章主要介紹了node學(xué)習(xí)筆記之讀寫文件與開啟第一個web服務(wù)器操作,結(jié)合實(shí)例形式分析了nodejs文件讀寫及創(chuàng)建web服務(wù)接收request請求與處理相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
Node.js如何快速導(dǎo)出多表頭的excel文件實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Node.js如何快速導(dǎo)出多表頭的excel文件實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
修改Nodejs內(nèi)置的npm默認(rèn)配置路徑方法
今天小編就為大家分享一篇修改Nodejs內(nèi)置的npm默認(rèn)配置路徑方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
nodejs服務(wù)搭建教程 nodejs訪問本地站點(diǎn)文件
這篇文章主要為大家詳細(xì)介紹了nodejs服務(wù)搭建教程,訪問本地站點(diǎn)文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04

