实现思路:文件夹(datalog)下面有多个文件夹(20231123),下面是log.txt,循环遍历获取到log.txt,用split切割为数组,然后使用正则匹配代码对应的参数值,存放在数组中,最后写入excel
│ TxtToExcel.js
│
├─dataLog
│ │ HJ 212-2017 污染物在线监控(监测)系统数据传输标准.pdf
│ │
│ ├─20231128
│ │ log.txt
│ │
│ └─20231129
│ log.txt
│
代码:
// 引入模块
const fs = require('fs');
const path = require('path');
const XLSX = require('xlsx')
// 正则匹配
let typeHregex = /CN=(2061);/; // 小时数据
let type5Mregex = /CN=(2051);/; // 5分钟数据
let type1Mregex = /CN=(2011);/; // 1分钟数据
let Tregex = /DataTime=(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; // 时间
let MN = /MN=(.*?);/; // 设备MN号
let PM10regex = /a34002-Avg=(.*?),/;
let PM10regex1 = /a34002-Rtd=(.*?),/;
let PM25regex = /a34004-Avg=(.*?),/;
let PM25regex1 = /a34004-Rtd=(.*?),/;
let Tspregex = /a34001-Avg=(.*?),/; // 悬浮颗粒物
let Wdregex = /a01001-Avg=(.*?),/; // 温度
let Sdregex = /a01002-Avg=(.*?),/; // 湿度
let Fsregex = /a01007-Avg=(.*?),/; // 风速
let Fxregex = /a01008-Avg=(.*?),/; // 风向
let Qyregex = /a01006-Avg=(.*?),/; // 气压
let SO2regex = /a21026-Avg=(.*?),/; // 二氧化硫
let SO2regex1 = /a21026-Rtd=(.*?),/; // 二氧化硫
let Coregex = /a21005-Avg=(.*?),/; // 一氧化碳
let Coregex1 = /a21005-Rtd=(.*?),/; // 一氧化碳
let NO2regex = /a21004-Avg=(.*?),/; // 二氧化氮
let NO2regex1 = /a21004-Rtd=(.*?),/; // 二氧化氮
let O3regex = /a05024-Avg=(.*?),/; // 臭氧
let O3regex1 = /o31104-Avg=(.*?),/; // 臭氧
let O3regex2 = /a05024-Rtd=(.*?),/; // 臭氧
let O3regex3 = /ac0001-Rtd=(.*?),/; // 臭氧
// 将JSON对象写入Excel
function writeArrayToExcel(arrayData, fileName) {
// 创建一个工作簿
let WorkSheet = XLSX.utils.aoa_to_sheet(arrayData);
// 创建一个工作表
let new_workbook = XLSX.utils.book_new();
// 将数组数据写入工作表
XLSX.utils.book_append_sheet(new_workbook, WorkSheet, '第一页');
// 将工作簿写入文件
try {
XLSX.writeFile(new_workbook, fileName)
console.log('写入文件成功!')
} catch (err) {
console.log('写入文件失败!' + err)
}
}
// 解析结果表头
let fileDataList = [[
'采样时间',
'设备mn号',
'PM10',
'PM25',
'二氧化硫SO2',
'一氧化碳CO',
'二氧化氮NO2',
'臭氧O3',
'悬浮颗粒物',
'温度',
'湿度',
'风速',
'风向',
'气压',
]]
// 正则解析
const jxFun = (item, typeRegex, mnValue) => {
let result = Tregex.exec(item);
if (!result[6]) return;
if (!typeRegex.exec(item)) return;
if (mnValue && /MN=(.*?);/.exec(item)[1] !== mnValue) return;
let content = [
result ? `${result[1]}-${result[2]}-${result[3]} ${result[4]}:${result[5]}:${result[6]}` : '',
MN.exec(item) ? MN.exec(item)[1] : '--',
PM10regex.exec(item) ? PM10regex.exec(item)[1] : PM10regex1.exec(item) ? PM10regex1.exec(item)[1] : '--',
PM25regex.exec(item) ? PM25regex.exec(item)[1] : PM25regex1.exec(item) ? PM25regex1.exec(item)[1] : '--',
SO2regex.exec(item) ? SO2regex.exec(item)[1] : SO2regex1.exec(item) ? SO2regex1.exec(item)[1] : '--',
Coregex.exec(item) ? Coregex.exec(item)[1] : Coregex1.exec(item) ? Coregex1.exec(item)[1] : '--',
NO2regex.exec(item) ? NO2regex.exec(item)[1] : NO2regex1.exec(item) ? NO2regex1.exec(item)[1] : '--',
O3regex.exec(item) ? O3regex.exec(item)[1] : O3regex1.exec(item) ? O3regex1.exec(item)[1] : O3regex2.exec(item) ? O3regex2.exec(item)[1] : O3regex3.exec(item) ? O3regex3.exec(item)[1] : '--',
Tspregex.exec(item) ? Tspregex.exec(item)[1] : '--',
Wdregex.exec(item) ? Wdregex.exec(item)[1] : '--',
Sdregex.exec(item) ? Sdregex.exec(item)[1] : '--',
Fsregex.exec(item) ? Fsregex.exec(item)[1] : '--',
Fxregex.exec(item) ? Fxregex.exec(item)[1] : '--',
Qyregex.exec(item) ? Qyregex.exec(item)[1] : '--',
]
return content
}
function processing(data, searchType, mn) {
let dataList = []
let arr = data.split('##').slice(1)
if (searchType == 1 && mn) {
console.log('小时 ' + mn + ' 数据');
arr.forEach(item => {
if (jxFun(item, typeHregex, mn) !== undefined) {
dataList.push(jxFun(item, typeHregex, mn))
}
})
} else if (searchType == 2 && mn) {
console.log('5分钟 ' + mn + ' 数据');
arr.forEach(item => {
if (jxFun(item, type5Mregex, mn) !== undefined) {
dataList.push(jxFun(item, type5Mregex, mn))
}
})
} else if (searchType == 3 && mn) {
console.log('1分钟 ' + mn + ' 数据');
arr.forEach(item => {
if (jxFun(item, type1Mregex, mn) !== undefined) {
dataList.push(jxFun(item, type1Mregex, mn))
}
})
} else if (searchType == 1 && !mn) {
console.log('小时数据');
arr.forEach(item => {
jxFun(item, typeHregex, null) !== undefined
if (jxFun(item, typeHregex, null) !== undefined) {
dataList.push(jxFun(item, typeHregex, null))
}
})
} else if (searchType == 2 && !mn) {
console.log('5分钟数据');
arr.forEach(item => {
if (jxFun(item, type5Mregex, null) !== undefined) {
dataList.push(jxFun(item, type5Mregex, null))
}
})
} else if (searchType == 3 && !mn) {
console.log('1分钟数据');
arr.forEach(item => {
if (jxFun(item, type1Mregex, null) !== undefined) {
dataList.push(jxFun(item, type1Mregex, null))
}
})
}
return dataList
}
// 递归遍历获取文件
const getFilesRecursively = (directory) => {
let filesAndDirectories = fs.readdirSync(directory);
let fullPathFiles = [];
filesAndDirectories.forEach((item) => {
let fullPath = path.join(directory, item);
let stats = fs.lstatSync(fullPath);
if (stats.isDirectory()) {
fullPathFiles = fullPathFiles.concat(getFilesRecursively(fullPath));
} else if (stats.isFile() && path.extname(fullPath) === '.txt') {
fullPathFiles.push(fullPath);
}
});
return fullPathFiles;
}
// 同步读取文件内容
function readFileAsync(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
// 文件夹路径
const folderPath = path.join(__dirname, './dataLog');
const filePathList = getFilesRecursively(folderPath);
// 遍历读取并写入EXCEL
async function txtToExcelAsync(filePathList) {
for (const filePath of filePathList) {
try {
console.log('正在处理文件:', filePath);
const data = await readFileAsync(filePath);
fileDataList.push(...processing(data));
} catch (err) {
console.log('读取文件失败!' + err);
}
}
writeArrayToExcel(fileDataList, 'result.xlsx');
}
txtToExcelAsync(filePathList)
// 方法导出
module.exports = {
txtToExcelAsync
}
1 条评论
不错不错,我喜欢看