Алгоритм для сравнения нескольких таблиц exel

Задача стоит следующая: есть заполненная данными таблица exel (назову ее главной), содержимое этой таблицы нужно сравнить с еще тремя другими таблицами. Если значение из главной таблицы НЕ встречается ни в одной из трех других, то это значение нужно записать в новую таблицу с результатами. Если значение из главной таблицы есть хотя бы в одной из трех других, то такое значение никуда записывать не нужно. Таблицы объемные, количество значений везде разное.

У меня возникли трудности именно с самим алгоритмом сравнения и перебора данных. Есть мысли, как это можно эффективно реализовать?


Ответы (2 шт):

Автор решения: rotabor

Предлагаю вам следующий алгоритм:

  1. Выбрать из каждой проверочной таблицы ключевое поле (столбец), объединить три эти диапазона, взять только уникальные ключи и отсортировать.
  2. Сделать сортировочный ключ для основной таблицы и пройтись по ней.

Используйте алгоритм Way2_NoIntegrity_Advanced.

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

Не забываем про хэш-таблицы. Есть даже специальные алгоритмы для быстрого гарантированного подтверждения отсутствия искомого ключа. Один из них - Фильтр Блума. На SO есть вопросы и ответы про него.

→ Ссылка
Автор решения: m. vokhm

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

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

Иными словами, у вас есть некий набор или множество значений (вы не указали, кстати, какого именно типа, а это может влиять на выбор подхода), назовем его A, и несколько других наборов, назовем их B1, B2, ... Bn. Вам нужно найти множество C, которое содержит все элементы A, кроме тех, которые содержатся хотя бы в одном из множеств B1, B2, ... Bn.

На языке теории множеств такая операция записывается C = A - (B1 + B2 + .. + Bn). В Java существует семейство классов предназначенных специально для реализации операций над множествами, это интерфейс Set и реализующие его классы, в которых есть методы для добавления элементов и для объединения и вычитания множеств. Для нашей ситуации (порядок элементов не важен, быстродействие важно) лучше всего подходит класс HashSet. Объединение множеств можно реализовать просто как чтение всех элементов из всех файлов, содержащих значения B1, B2, ... Bn, в одно и то же множество B, или же вычитание можно реализовать, как удаление читаемых элементов из заранее прочитанного A.

Таким образом, решение вашей задачи на неком условном псевдокоде с элементами Java можно записать так:

Set<НашТип> setA = new HashSet<>();
НашТип element;
while ((element = fileA.read()) != null) { 
  setA.add(element); // Добавляем элемент из первого файла
} 
for (File fileB: ourFilesToSubtract) {  // Все файлы, которые надо вычесть
  while ((element = fileB.read()) != null) {
    setA.remove(element); // Удаляем элемент, содержащийся в файле B 
  } 
} 
// Теперь setA содержит только те элементы из первого файла,
// которых нету в других. Запишем их в файл
for (НашТип element: setA) {
  fileC.write(element)
}

Операции с файлами тут показаны условно, сделайте их так, как вам надо

→ Ссылка