首页 > 解决方案 > 根据时间值在每 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小时的数据是这样的,有什么解决方案的建议吗?

标签: javascriptnode.jsarraystext

解决方案


这是一个有效的解决方案。我猜你需要对整个文件进行调整。

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


推荐阅读