实现思路:文件夹(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
}
最后修改:2024 年 05 月 21 日
如果觉得我的文章对你有用,请随意赞赏