У меня довольно большой набор данных. Минимальные строки находятся в диапазоне 8K. Мне нужно удалить дубликаты на двух условиях. Первым будет то, что я называю «Истинный дубликат». По определению это означает, что вся строка является дубликатом. Вот сценарий, который у меня есть, который работает для этого сценария.
function removeDuplicates(sheet) {
var data = sheet.getDataRange().getValues();
var newData = [];
var trueDuplicateCount = 0;
for (var i in data) {
var row = data[i];
var duplicate = false;
for (var j in newData) {
if (row.join() == newData[j].join()) {//Look for duplicates across all rows. True Duplicate
duplicate = true;
trueDuplicateCount = trueDuplicateCount + 1;
}
}
if (!duplicate) {
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
return trueDuplicateCount;
}
Другое условие будет дубликатом, основанным на информации одного столбца. После удаления «True Duplicates» мне нужно удалить дубликаты на основе столбца. Я хотел бы сохранить строку с самой ранней датой в другом столбце.
Вот то, что я пытался, но не работает для этого сценария.
function removeDuplicates(sheet) {
var data = sheet.getDataRange().getValues();
var newData = [];
var trueDuplicateCount = 0;
var diffDateDuplicateCount = 0;
for (var i in data) {
var row = data[i];
var duplicate = false;
for (var j in newData) {
if (row.join() == newData[j].join()) {//Look for duplicates across all rows. True Duplicate
duplicate = true;
trueDuplicateCount = trueDuplicateCount + 1;
}
if(row[1] == newData[j][1] && row[0] > newData[j][0]){
duplicate = true;
diffDateDuplicateCount = diffDateDuplicateCount + 1
}
}
if (!duplicate) {
newData.push(row);
}
}
sheet.clearContents();
sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
return [trueDuplicateCount, diffDateDuplicateCount];
}
Вот пример набора данных
после удаления «истинных дубликатов»
После удаления дубликата с более поздней датой
Выше приведено то, что осталось бы после запуска сценария, а затем функция также возвращала бы массив с счетчиком для каждого типа удаленных дубликатов.
Текущий сценарий работает для части True Duplicates, но я меня беспокоит скорость и, возможно, время ожидания для большого набора данных. С 8K рядами я уже вижу почти 3 минуты бега. С учетом сказанного, вот мои вопросы.
Условия
- Скорость, скорость, скорость. Есть ли более эффективный способ справиться с этим? Это мое самое большое беспокойство.
- Необходимо удалить дубликаты с более поздней датой и сохранить один с самой ранней датой.
- Необходимо вернуть счет для каждого типа удаленных дубликатов .
Надеясь, это прояснит ситуацию. Я показал, что я хочу сделать с каждым шагом. (Номер Акта составлен)
Комментарий о выбранном решении
Я выбрал решение, которое выполнен быстрее всех. В то время как Танайке и Мастер работали, я пошел с Мастером, потому что я ожидаю много строк в будущем. Каждая миллисекунда считается.
Я просто хочу поблагодарить тех, кто ответил, особенно Танаике, которые проделали большую работу. Надеюсь, этот вопрос станет святым Граалем для удаления дубликатов, потому что ваше решение не v8 по-прежнему отлично подходит для тех, кто не v8.