#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. Да, пробовал, но, похоже, он не генерирует среднее десятичное значение в выходных данных. Он показывает только среднее целочисленное значение.