Я знаю процесс создания файла CSV, поэтому мой вопрос более специфичен для данных, которые у меня есть. У меня есть некоторые рекордеры, и у каждого из них есть некоторые данные. Каждая информация состоит из значения и временной метки. Так записывающее выглядит следующим образом:Создание CSV с разнообразными и большими данными
'recorder_name': {
samples: [{v: 19, t: new Date()}]
}
Проблема заключается в том, что не все регистраторы имеют значения для всех меток времени, и они не имеют одинаковый объем данных. Я начал играть с lodash
, но он очень медленный. То, что я до сих пор является следующее:
function createCSVRows(data) {
const timestamps = [];
const csvRows = [];
//data contains all recorders
_.forEach(data, ({samples}) => {
_.forEach(samples, s => {
const timestamp = moment(s.t).utc();
timestamps.push(timestamp.format('YYYY-MM-DD HH:mm:ss'));
});
});
_(timestamps)
.uniq()
.sortBy(t => moment(t).utc())
.forEach(t => {
const csvRow = [t];
_.forEach(data, ({samples}) => {
const value = _.find(samples, s => moment(s.t).utc().format('YYYY-MM-DD HH:mm:ss') === t);
if(!value) {
csvRow.push('');
} else {
csvRow.push(value.v);
}
});
csvRows.push(csvRow);
})
.value();
return csvRows;
}
Итак, я стараюсь, чтобы получить все доступные временные метки, а затем сохранить только уникальные. Проблема заключается в том, как вывести значение для каждой отметки времени. Функция find
- это то, что занимает много времени, поскольку каждый рекордер имеет в среднем 500-600 точек данных. Я никогда не видел, чтобы функция выполнялась до конца, так как вкладка браузера умирает через короткое время.
Благодаря
EDIT: В соответствии с комментарием @charlietfl «ы Я также попытался следующие:
_.forEach(data, ({samples}) => {
_.forEach(samples, s => {
const timestamp = moment(s.t).utc().format('YYYY-MM-DD HH:mm:ss');
if(!timestamps[timestamp]) {
timestamps[timestamp] = [];
}
_.forEach(timestamps, (v, t) => {
if(t === timestamp) {
v.push(s.v);
} else {
v.push('');
}
});
});
});
Проблема снова в том, что я должен перебрать меток времени, потому что у меня есть для заполнения всех остальных временных меток пустыми значениями. Закладка все еще умирает. Есть идеи?
EDIT 2: Образец данных:
{
'recorder_a': {
samples: [{t: new Date(2015,02,03), v: 10}, {t: new Date(2015,02,04), v: 15}]
},
'recorder_b': {
samples: [{t: new Date(2015,02,03), v: 11}]
}
}
и ожидаемый CSV должен выглядеть следующим образом:
Date recorder_a recorder_b
2015-02-03 10 11
2015-02-04 15 -
Я имею в виду, что если записывающее устройство не имеет значение для метки времени, тогда я должен показать пустую оболочку.
Более эффективный для создания объекта, где временные метки ключи. Итерации один раз и проверить, существует ли ключ или нет. Затем переместите объект обратно в массив. Удалит поиск повторяющегося массива, который 'find()' делает – charlietfl
@charlietfl, вы имеете в виду вместо добавления временных меток в массив? – XeniaSis
Вы могли бы представить небольшой пример? – XeniaSis