【问题标题】:Break a text file after every 15 minutes time interval based on time values and count average numeric value for "File Count" in Nodejs?根据时间值在每 15 分钟时间间隔后中断一个文本文件并计算 Nodejs 中“文件计数”的平均数值?
【发布时间】:2020-10-29 23:56:25
【问题描述】:

我有一个包含大约 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小时的数据是这样的,有什么解决办法吗?

【问题讨论】:

  • 请提供更多信息。就像最短的可重现代码一样。
  • 这是一个保存的 24 小时数据的文本文件,需要按时间读取,每 15 分钟循环一次,然后计算每 15 分钟时间循环的平均文件数。不幸的是,我还没有找到一个好的解决方案,所以寻求帮助。
  • 文本是字符串吗?
  • 不,它不是字符串,它是我从另一个逻辑保存为文本文件的输出。

标签: javascript node.js arrays text


【解决方案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

【讨论】:

  • 我有另一个文件,我需要找到十进制值的平均值,其余逻辑与上面相同,我想我没有得到正确的平均值,你有什么建议 Yochanan。
  • 这个文件和我上面分享的文件一样,我需要为“value”设置相同的逻辑来找到平均值,因为它是十进制的,是否需要对您的代码进行任何更改@yochanan辛伯格。
  • 这里是:javascript [ Time: 02:04:18.265 | Value : 52.337254, |Time: 02:04:18.558 | Value: 43.105881, |Time: 02:04:18.919 |Value: 62.392159, |Time: 02:05:09.987 | Value: 83.654743] 等等....
  • 基本是一样的逻辑。只需将第 7 行中的“File Count”替换为“Value”即可。并将所有出现的“fileCountAvg”替换为“valueAvg”,它应该可以正常工作。
  • 是的,试过了,但它似乎没有在输出中生成平均十进制值。它只显示平均整数值。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多