Удалить дубли в нескольких таблицах по одному столбцу

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 449
Реакции
5 478
Баллы
113
Решение!
Есть несколько таблиц с одинаковыми заголовками. Мне нужно удалить дубли между ними по определенному столбцу. Задача не простая. Какие есть идеи. Объединять таблицы не вариант.
 
Последнее редактирование:
несколько это сколько? И как должен выглядеть результат?
28 таблиц.

И еще 2 момент всплыл. Можно ли при наличии дублей удалять полностью строки (не оставляя оригинал).
 
28 таблиц.

И еще 2 момент всплыл. Можно ли при наличии дублей удалять полностью строки (не оставляя оригинал).

не знаю как стандартными, но через код, почему нет.Так как должен выглядеть результат?
 
не знаю как стандартными, но через код, почему нет.Так как должен выглядеть результат?
Есть 28 таблиц, между ними есть дубли. Мне надо их удалить что бы остались все теже 28 таблиц. И не просто дубли. А как правильно сказать то. Ну вот если нашел он 2 одинаковые строки в разных таблицах, то удалил их обе.
 
Есть 28 таблиц, между ними есть дубли. Мне надо их удалить что бы остались все теже 28 таблиц. И не просто дубли. А как правильно сказать то. Ну вот если нашел он 2 одинаковые строки в разных таблицах, то удалил их обе.
ну ты попал)
 
Ну хотя бы просто дубли удалить можно?
По любому на костылях решение должно быть какое-то. Я не прошу красиво на шарпе, мне пофигу, лишь бы результат был.
 
Тебе надо на вход дать 28 путей к таблицам. Создать массив, который будет содержать 28 элементов, каждый из которых будет списком, отвечающим за таблицу, а элементами списка будут массивы ячеек строк. Перебрать эти 28 строк в цикле, поочерёдно привязываю таблицы к зенновской таблице проекта, и перенести данные в этот основной массив.

Это всё на случай, если из зенно из кода нельзя создавать таблицы (вроде как нельзя). Если можно, то нам нужен массив таблиц,это было бы проще.

Потом тебе нужно замутить тройной цикл. 1й цикл будет гнать от 0 до 28-1, отвечает за текущую таблицу. 2й цикл будет гнать от индекса 1го цикла +1, до 28, он будет отвечать за таблицу, с которой будет происходить сравнение. 3й цикл будет гнать по строкам таблицы 1го цикла, 4й по строкам таблицы 2го цикла.

В общем звучит непонятно, на деле будет ещё хуже, удачи)
 
  • Оценить
Реакции: Astraport
Тебе надо на вход дать 28 путей к таблицам. Создать массив, который будет содержать 28 элементов, каждый из которых будет списком, отвечающим за таблицу, а элементами списка будут массивы ячеек строк. Перебрать эти 28 строк в цикле, поочерёдно привязываю таблицы к зенновской таблице проекта, и перенести данные в этот основной массив.

Это всё на случай, если из зенно из кода нельзя создавать таблицы (вроде как нельзя). Если можно, то нам нужен массив таблиц,это было бы проще.

Потом тебе нужно замутить тройной цикл. 1й цикл будет гнать от 0 до 28-1, отвечает за текущую таблицу. 2й цикл будет гнать от индекса 1го цикла +1, до 28, он будет отвечать за таблицу, с которой будет происходить сравнение. 3й цикл будет гнать по строкам таблицы 1го цикла, 4й по строкам таблицы 2го цикла.

В общем звучит непонятно, на деле будет ещё хуже, удачи)
Какой ужас :D
Смотри а если например взять все таблицы, и в конце каждой добавить строку метку. потом их все собрать в одну, удалить дубли и по этой метке разложить обратно. по моему так будет проще чем в зенке этот треш мутить))
 
  • Оценить
Реакции: orka13
Какой ужас :D
Смотри а если например взять все таблицы, и в конце каждой добавить строку метку. потом их все собрать в одну, удалить дубли и по этой метке разложить обратно. по моему так будет проще чем в зенке этот треш мутить))
по идее. норм вариант
 
  • Оценить
Реакции: Mikhail B.
Какой ужас :D
Смотри а если например взять все таблицы, и в конце каждой добавить строку метку. потом их все собрать в одну, удалить дубли и по этой метке разложить обратно. по моему так будет проще чем в зенке этот треш мутить))
вот вот, я только хотел это написать.
 
  • Оценить
Реакции: Mikhail B.
единственной, 1й дубль так не удалится
Тогда такой алгоритм C#:
1. Клеим в 1 таблицу все ( с метками в отдельном столбце).
2. По очереди берем каждую ячейку нужного стобца, в котором надо находить дубли.
3. Ищем в цикле по всей таблице (начиная от номера этой активной строки и до конца таблицы) сколько раз встречается эта ячейка.
4. Если встречается > 1 раза, то удаляем все строки с ней.
5. Двигаемся дальше до конца.

6. Собираем все обратно в отдельные таблицы.
 
  • Оценить
Реакции: doc
единственной, 1й дубль так не удалится
Ну возможно в екселе можно так удалить. Надо уточнить этот момент.

Тогда такой алгоритм C#:
1. Клеим в 1 таблицу все ( с метками в отдельном столбце).
2. По очереди берем каждую ячейку нужного стобца, в котором надо находить дубли.
3. Ищем в цикле по всей таблице (начиная от номера этой активной строки и до конца таблицы) сколько раз встречается эта ячейка.
4. Если встречается > 1 раза, то удаляем все строки с ней.
5. Двигаемся дальше до конца.

6. Собираем все обратно в отдельные таблицы.
Ага только в шарпе я не очень)) Кубы решают )))
 
В таблицах одинаковое количество столбцов?
 
Это можно сделать средствами екселя
 
Склеиваешь все файлы в 1.
В екселе в условном форматировании подсвечиваешь уникальные строки в столбце.
Раскидываешь обратно по файлам.
Потом ищешь как удалить помеченные строки.
 
Склеиваешь все файлы в 1.
В екселе в условном форматировании подсвечиваешь уникальные строки в столбце.
Раскидываешь обратно по файлам.
Потом ищешь как удалить помеченные строки.
Вот уже ситуация проясняется)
 
Код:
Развернуть Свернуть Копировать
var list2 = list1.GroupBy(x => x)
                            .Where(group => group.Count() == 1)
                                .Select(group => group.Key).ToList();
Так работает с List, удаляет и дубликат и оригинал.
 
Стартовые данные чьи дубли ищем в 1 таблице или же в каждой?
Например в таблице 1 есть вася в 3 строке,в таблице 5 он тоже есть значит удаляем из этих таблиц.Или же старт может быть в любой таблице?
Сформулируй последовательность действий словами.
Или должно сначала с первой таблици все строки взять по очереди и проверить в других таблицах,потом со второй взять все и т.д.?
 
Код:
Развернуть Свернуть Копировать
var list2 = list1.GroupBy(x => x)
                            .Where(group => group.Count() == 1)
                                .Select(group => group.Key).ToList();
Так работает с List, удаляет и дубликат и оригинал.
Строковые дубли меня не интересуют. Мне надо удалять дубли в колонках.

Стартовые данные чьи дубли ищем в 1 таблице или же в каждой?
Например в таблице 1 есть вася в 3 строке,в таблице 5 он тоже есть значит удаляем из этих таблиц.Или же старт может быть в любой таблице?
Сформулируй последовательность действий словами.
Или должно сначала с первой таблици все строки взять по очереди и проверить в других таблицах,потом со второй взять все и т.д.?
Дубли могут быть во всех таблицах. Я хз как еще сформулировать. Вася есть во всех таблицах, может и не быть. Если Вася это дубль, то мы удаляем его со всех таблиц. Если дубли Васи не найдены, то оставляем его в той таблице в которой он был изначально. Все строки остаются на своих местах.
 
Строковые дубли меня не интересуют. Мне надо удалять дубли в колонках.


Дубли могут быть во всех таблицах. Я хз как еще сформулировать. Вася есть во всех таблицах, может и не быть. Если Вася это дубль, то мы удаляем его со всех таблиц. Если дубли Васи не найдены, то оставляем его в той таблице в которой он был изначально. Все строки остаются на своих местах.
Всегда в 1 столбце ищем?Если нашли то удаляем всю строку?
 
Всегда в 1 столбце ищем?Если нашли то удаляем всю строку?
Ну да в одном. Столбец телефоны, всегда в нем телефоны.
Строку всю обязательно иначе таблица сместится.

Но хотелось бы иметь возможность по другому столбцу пройтись тоже.

@Vlad_Curnoi Просто так спросил или хочешь меня обрадовать?))
 
Последнее редактирование:
Ну да в одном. Столбец телефоны, всегда в нем телефоны.
Строку всю обязательно иначе таблица сместится.

Но хотелось бы иметь возможность по другому столбцу пройтись тоже.

@Vlad_Curnoi Просто так спросил или хочешь меня обрадовать?))
Да вот задачка интересная,вот думаю как вариант 2 таблицы создать,их привязвыать по очереди к файлу,после искать.Не пойму зачем куча таблиц если данные похожи?
 
Да вот задачка интересная,вот думаю как вариант 2 таблицы создать,их привязвыать по очереди к файлу,после искать.Не пойму зачем куча таблиц если данные похожи?
Данные разные, но я где-то косячнул и данные записались не туда куда нужно. И теперь надо их удалить. Вроде даже строки одинаковые, может тогда строками можно почистить дубли если так не получается. Создавать таблицы новые я не хочу я уже и так руками провозился много с ними, что бы привести в приемлемый вид, осталось только с дублями разобраться и все.
 
http://zennolab.com/discussion/threads/udalit-dubli-v-neskolkix-tablicax-po-odnomu-stolbcu.48561/
Строковые дубли меня не интересуют. Мне надо удалять дубли в колонках.
Так запихните колонку в список, создайте класс для листа с индексом таблицы и поудаляйте дубли, залейте назад по таблицам. Порядок строк должен сохраниться?
 
пример в студию )
Код:
Развернуть Свернуть Копировать
    class OurTables
    {
        public string Column { get; set; }
        public string Index { get; set; }
    }



List<OurTable> list1= new List<OurTable>();

var list2 = list1.GroupBy(x => x.Column)
                            .Where(group => group.Count() == 1)
                                .Select(group => new { Column = group.Key, Index = group.Select(x=>x.Index).ToList()[0] }).ToList();

в класс добавить нужные Вам элементы, удалить дубли в столбце, индекс - это номер таблицы, после удаления всех дублей назад в таблицу. Для работы с эксель есть ClosedXML, там все просто и быстро.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)