NodeJS (JavaScript) - самый быстрый способ конвертировать дату? - PullRequest
0 голосов
/ 31 декабря 2018

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

20170506014255,100.01,200.02

Используя jFile , я могу читать и анализировать все строки 1,5M + примерно за 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 секунд. Задыхается!

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

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

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

Ответы [ 2 ]

0 голосов
/ 02 января 2019

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

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

// 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.log(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.log(formatDate('20170506014255'));
0 голосов
/ 31 декабря 2018

Я полагаю, это быстрее жестко закодировать при разборе:

 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));
...