NodeJS (JavaScript) - самый быстрый способ конвертировать дату?

В NodeJS я читаю и разбираю файл .txt, содержащий более 1,5 млн строк. Каждая строка имеет формат: date,number,number, где каждая дата - yyyyMMddhhmmss. Примерная строка:

20170506014255,100.01,200.02

Используя jFile, я могу прочитать и проанализировать все 1,5 миллиона строк примерно за 2 секунды ...

var jFile = require('jfile');

var data = [];

var dataFile = new jFile('./dataFile.txt');

dataFile.lines.forEach(function(line) {
    data.push(line.split(','));
});

Работает отлично! Но я бы хотел изменить формат даты на другой. Для этого я использую Формат даты для преобразования ...

... same as previous, with new line within forEach() ...

var dateFormatter = require('date-format');

dataFile.lines.forEach(function(line) {
    let tdata = line.split(',');
    tdata[0] = dateFormatter('MM/dd/yy hh:mm:ss', dateFormatter.parse('yyyyMMddhhmmss', tdata[0]));
    data.push(tdata);
});

Опять же, это отлично работает! Главным образом. То, что раньше занимало всего 2 секунды, теперь занимает около 25 секунд. Ох!

В идеале в файле должны быть правильно отформатированы даты, но это не в моих руках.

Есть ли более быстрый способ сделать это преобразование? Может есть более родной подход или просто более быстрый пакет?

Спасибо за понимание!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
378
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, что быстрее жестко запрограммировать синтаксический анализ:

 function fixFormat(date) {
  const yy = date.slice(2, 4);
  const MM = date.slice(4, 6);
  const dd = date.slice(6, 8);
  const hh = date.slice(8, 10);
  const mm = date.slice(10, 12);
  const ss = date.slice(12, 14);

  return `${MM}/${dd}/${yy} ${hh}:${mm}:${ss}`;
 }

Или действительно действительно некрасиво:

const y = 2, M = 4, d = 6, h = 8, m = 10, s = 12;
const pattern = fn => date => fn(p => date[p] + date[p + 1])

const fixFormat = pattern(p => p(M) + "/" + p(d) + "/" + p(y) + " " + p(h) + ":" + p(m) + ":" + p(s));

Бум! Добавляет всего одну секунду времени обработки для всего набора. Я уверен, что все даты будут отформатированы одинаково, так что это идеальный вариант. Большое спасибо! Я все равно приму ваш ответ, но у вас есть yyyy наверху и yy в ответ. Я просто изменил первый синтаксический анализ на const yy = date.slice(2, 4);, так как меня все равно интересуют только последние два символа. Хотя отличное исправление!

Birrel 31.12.2018 01:10

Может ли одно совпадение регулярного выражения быть быстрее, чем 6 последовательных вызовов .slice ()? Придется запустить несколько тестов. / [0-9] {2,2} ([0-9] {2,2}) ([0-9] {2,2}) ([0-9] {2,2}) ([0 -9] {2,2}) (‌ [0-9] {2,2}) ([0-9] {2, ‌ 2}) /

Eric Vautier 31.12.2018 01:24

@ EricVautier - да, но регулярное выражение может быть намного проще в сочетании с совпадение. ;-)

RobG 02.01.2019 02:35

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

Все, что анализирует строку, создает Date, а затем генерирует строку, если она будет медленнее, чем что-то, что просто переформатирует строку. Подход Йонаса верен и, вероятно, достаточно быстр, но все эти срезы должны сказаться на себе. Одно совпадение должно быть быстрее, но решать вам:

// Convert a timestamp in yyyyMMddhhmmss format to MM/dd/yy hh:mm:ss
// where "hh" is assumed to be 24 hr
function formatDate(s) {
  var b = s.match(/\d\d/g);
  return `${b[2]}/${b[3]}/${b[1]} ${b[4]}:${b[5]}:${b[6]}`;
}

console.info(formatDate('20170506014255'));

Понятия не имею, быстрее ли это, но кода определенно намного меньше. Если вы действительно хотите сделать это быстро, создайте регулярное выражение один раз:

// Convert a timestamp in yyyyMMddhhmmss format to MM/dd/yy hh:mm:ss
// where "hh" is assumed to be 24 hr
var formatDate = (function() {
  var re = /\d\d/g;
  return function (s) {
    var b = s.match(re);
    return `${b[2]}/${b[3]}/${b[1]} ${b[4]}:${b[5]}:${b[6]}`;
  };
}());

console.info(formatDate('20170506014255'));

Нам просто нужен тест, чтобы увидеть, кто победит ... :)

Jonas Wilms 02.01.2019 07:49

@ JonasWilms — https://jsperf.com/reformat-date. Он идентифицировал MS Edge как Chrome 64. Похоже, строковые операции сильно оптимизированы. Если вы не используете Edge…

RobG 02.01.2019 10:35

и я обязательно должен обновить свой Firefox ... следующая версия, похоже, удвоит общую скорость (или мой процессор просто медленный), однако это похоже на явную победу :)

Jonas Wilms 02.01.2019 12:50

Другие вопросы по теме