javascript - 根据时间值在每 15 分钟时间间隔后中断一个文本文件并计算 Nodejs 中“文件计数”的平均数值?
问题描述
我有一个包含大约 2000 行数据的文本文件,这些数据反映了 24 小时的时间段,以及在不同时间打开的文件数量。我需要每隔 15 分钟中断一个文件,并且需要计算并打印每 15 分钟打开的平均文件数?
文件格式如下所示:
[
|Time: 01:22:52.106 |File Count: 40
|Time: 01:22:52.402 |File Count: 45
|Time: 01:23:45.960 |File Count: 30
|Time: 01:23:46.231 |File Count: 30
|Time: 01:27:03.289 |File Count: 31
|Time: 01:27:03.706 |File Count: 32
|Time: 01:27:04.215 |File Count: 33
|Time: 01:27:04.830 |File Count: 31
|Time: 01:27:05.514 |File Count: 32
|Time: 01:27:05.912 |File Count: 32
|Time: 01:27:06.216 |File Count: 32
|Time: 01:27:06.216 |File Count: 32
|Time: 01:27:06.471 |File Count: 32
|Time: 01:27:06.472 |File Count: 32
|Time: 01:27:06.834 |File Count: 33
|Time: 01:33:58.900 |File Count: 31
|Time: 01:33:59.357 |File Count: 31
|Time: 01:35:41.991 |File Count: 32
|Time: 01:35:42.635 |File Count: 32
|Time: 01:35:43.276 |File Count: 32
|Time: 01:43:04.393 |File Count: 32
|Time: 01:43:04.669 |File Count: 32
|Time: 01:48:53.450 |File Count: 30
|Time: 01:48:53.716 |File Count: 30
|Time: 01:48:54.129 |File Count: 31
|Time: 01:48:54.316 |File Count: 30
|Time: 01:53:52.937 |File Count: 31
|Time: 01:53:53.212 |File Count: 30
|Time: 01:53:53.531 |File Count: 30
|Time: 01:54:12.570 |File Count: 32
|Time: 01:54:12.834 |File Count: 32
|Time: 01:58:10.622 |File Count: 29
|Time: 01:58:52.862 |File Count: 31
|Time: 01:58:53.133 |File Count: 31
|Time: 01:58:53.432 |File Count: 31
|Time: 01:59:44.771 |File Count: 31
|Time: 01:59:45.102 |File Count: 30
|Time: 02:01:40.451 |File Count: 30
|Time: 02:04:18.265 |File Count: 32
|Time: 02:04:18.558 |File Count: 33
|Time: 02:04:18.919 |File Count: 32
|Time: 02:05:09.987 |File Count: 31
|Time: 02:05:10.725 |File Count: 31
|Time: 02:05:10.942 |File Count: 31
|Time: 02:05:11.572 |File Count: 31
|Time: 02:09:09.052 |File Count: 32
|Time: 02:09:09.370 |File Count: 31
|Time: 02:09:09.714 |File Count: 31
|Time: 02:10:42.097 |File Count: 32
|Time: 02:10:42.312 |File Count: 33
|Time: 02:15:28.439 |File Count: 33
|Time: 02:16:56.419 |File Count: 30
|Time: 02:16:56.764 |File Count: 29
|Time: 02:16:57.105 |File Count: 31
|Time: 02:16:57.403 |File Count: 31
|Time: 02:19:44.922 |File Count: 0
|Time: 02:19:45.200 |File Count: 31
|Time: 02:20:00.930 |File Count: 31
|Time: 02:20:01.281 |File Count: 30
|Time: 02:20:01.542 |File Count: 30
|Time: 02:20:34.771 |File Count: 31
|Time: 02:20:35.040 |File Count: 31
1小时的数据是这样的,有什么解决方案的建议吗?
解决方案
这是一个有效的解决方案。我猜你需要对整个文件进行调整。
const fs = require('fs');
// import text file
let text = fs.readFileSync('./files.txt', 'utf-8');
//split text file to array and remove all Unnecessary characters
let arr = text.split(/\[|\]|,|: |\|Time|\|File Count|\r?\n|\r/g);
// remove empty elements
let filterdArr = arr.filter((el) => {
return el != "" && el !== " ";
})
//decler array for file data objects
let fileDataArr = [];
//populate file data array with objects in this form:
// { time: <miliseconds>, fileCount: <number> }
filterdArr.forEach((el, i) => {
if (i % 2 === 0) {
fileDataArr.push({
time: getMiliseconds(el),
fileCount: +filterdArr[i + 1],
})
}
});
// declere array for time periods
let timePeriodsArr = [];
// populate time eriods array with objects for each time period
for (let i = 0; i < 24; i++) {
let hours = i < 10 ? '0' + i : i;
for (let x = 0; x < 60; x += 15) {
let mins = x === 0 ? '00' : x;
timePeriodsArr.push({
timePeriod: `${hours}:${mins}`,
fileCountAvg: 0,
})
}
}
// get array length
let arrLng = timePeriodsArr.length - 1;
// for each time period get start and end time in miliseconds
timePeriodsArr.forEach((timeObj, i) => {
let startMs = getMiliseconds(timeObj.timePeriod)
let endMs = i + 1 < arrLng ? getMiliseconds(timePeriodsArr[i + 1].timePeriod) : 86400000;
let counter = 0;
// check for each file data object if fits the current time period and calculate the average
fileDataArr.forEach((fileObj, x) => {
if (fileObj.time >= startMs && fileObj.time < endMs) {
timeObj.fileCountAvg += fileObj.fileCount;
counter++;
}
})
timeObj.fileCountAvg = Math.round(timeObj.fileCountAvg / counter);
});
// time to miliseconds function
function getMiliseconds(el) {
el = el.split(/:|\./g);
if (el.length === 4) {
return (+el[0] * 60 * 60 + +el[1] * 60 + +el[2]) * 1000 + +el[3];
} else {
return (el[0] * 60 * 60 + el[1] * 60) * 1000;
}
}
console.log(timePeriodsArr);
您可以在此处下载工作解决方案:https ://github.com/yochanan-sheinberger/break-text-file.git
推荐阅读
- flutter - “没有引用声明‘setState’。” StatefulWidget 中 DropdownButton 的警告
- python - 噪声图像上的Opencv矩形检测
- azure - 是否可以使用应用程序网关在 AKS 中同时公开 HTTP 端口和 TCP 端口?
- java - 是否可以获取布局的 id 并在 ViewHolder 类中进行比较?
- python - 我正在尝试在 python 中安装散景库,但发生了错误。现在点子不起作用
- python - ImportError:图像转换需要 SciPy。安装 SciPy
- amazon-web-services - 如何构建 DynamoDB 索引以允许按多个字段进行检索
- c - 无法在文件开始时重写数据,但我可以在 C 中以追加模式在末尾应用
- node.js - 在 node.js 中,为什么在通过 node-postgres 连接时要使用池?
- ios - 如何获取客户端上的 MongoDB Realm 上次同步的日期时间?