Разрыв текстового файла через каждые 15 минут на основе временных значений и подсчета среднего числового значения для «Количества файлов» в Nodejs?

#javascript #node.js #arrays #text

#javascript #node.js #массивы #текст

Вопрос:

У меня есть текстовый файл с примерно 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 час выглядят так, есть предложения по решению?

Комментарии:

1. Пожалуйста, предоставьте дополнительную информацию. Например, кратчайший воспроизводимый код.

2. Это сохраненный текстовый файл с 24-часовыми данными, которые необходимо считывать по времени и разделять каждые 15 минут циклов, а также находить среднее количество файлов в каждом 15-минутном цикле времени. К сожалению, я пока не смог найти хорошее решение, поэтому прошу помощи.

3. является ли текст строкой?

4. Нет, это не строка, это вывод, который я сохранил как текстовый файл из другой логики.

Ответ №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 != "" amp;amp; 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 amp;amp; 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

Комментарии:

1. У меня есть другой файл, для которого мне нужно найти среднее значение десятичных значений, логика остальных такая же, как указано выше, я думаю, что я не получаю правильное среднее значение для этого, у вас есть какие-либо предложения, Йоханан.

2. Этот файл такой же, как файл, которым я поделился выше, мне нужно использовать ту же логику для «значения», чтобы найти среднее значение, поскольку оно в десятичной системе счисления, потребует ли это каких-либо изменений в вашем коде @йоханан шейнбергер.

3. Вот оно: 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] и так далее ….

4. Это в основном та же логика. Просто замените «Количество файлов» на «Значение» в строке 7. И замените все появления «fileCountAvg» на «valueAvg», и он должен работать нормально.

5. Да, пробовал, но, похоже, он не генерирует среднее десятичное значение в выходных данных. Он показывает только среднее целочисленное значение.