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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Решение!
Есть несколько таблиц с одинаковыми заголовками. Мне нужно удалить дубли между ними по определенному столбцу. Задача не простая. Какие есть идеи. Объединять таблицы не вариант.
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
несколько это сколько? И как должен выглядеть результат?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
несколько это сколько? И как должен выглядеть результат?
28 таблиц.

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
28 таблиц.

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
не знаю как стандартными, но через код, почему нет.Так как должен выглядеть результат?
Есть 28 таблиц, между ними есть дубли. Мне надо их удалить что бы остались все теже 28 таблиц. И не просто дубли. А как правильно сказать то. Ну вот если нашел он 2 одинаковые строки в разных таблицах, то удалил их обе.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Есть 28 таблиц, между ними есть дубли. Мне надо их удалить что бы остались все теже 28 таблиц. И не просто дубли. А как правильно сказать то. Ну вот если нашел он 2 одинаковые строки в разных таблицах, то удалил их обе.
ну ты попал)
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Ну хотя бы просто дубли удалить можно?
По любому на костылях решение должно быть какое-то. Я не прошу красиво на шарпе, мне пофигу, лишь бы результат был.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Тебе надо на вход дать 28 путей к таблицам. Создать массив, который будет содержать 28 элементов, каждый из которых будет списком, отвечающим за таблицу, а элементами списка будут массивы ячеек строк. Перебрать эти 28 строк в цикле, поочерёдно привязываю таблицы к зенновской таблице проекта, и перенести данные в этот основной массив.

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

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

В общем звучит непонятно, на деле будет ещё хуже, удачи)
 
  • Спасибо
Реакции: Astraport

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Тебе надо на вход дать 28 путей к таблицам. Создать массив, который будет содержать 28 элементов, каждый из которых будет списком, отвечающим за таблицу, а элементами списка будут массивы ячеек строк. Перебрать эти 28 строк в цикле, поочерёдно привязываю таблицы к зенновской таблице проекта, и перенести данные в этот основной массив.

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

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

В общем звучит непонятно, на деле будет ещё хуже, удачи)
Какой ужас :D
Смотри а если например взять все таблицы, и в конце каждой добавить строку метку. потом их все собрать в одну, удалить дубли и по этой метке разложить обратно. по моему так будет проще чем в зенке этот треш мутить))
 
  • Спасибо
Реакции: orka13

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Какой ужас :D
Смотри а если например взять все таблицы, и в конце каждой добавить строку метку. потом их все собрать в одну, удалить дубли и по этой метке разложить обратно. по моему так будет проще чем в зенке этот треш мутить))
по идее. норм вариант
 
  • Спасибо
Реакции: Mikhail B.

orka13

Client
Регистрация
07.05.2015
Сообщения
2 166
Благодарностей
2 167
Баллы
113
Какой ужас :D
Смотри а если например взять все таблицы, и в конце каждой добавить строку метку. потом их все собрать в одну, удалить дубли и по этой метке разложить обратно. по моему так будет проще чем в зенке этот треш мутить))
вот вот, я только хотел это написать.
 
  • Спасибо
Реакции: Mikhail B.

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
единственной, 1й дубль так не удалится
 

orka13

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

6. Собираем все обратно в отдельные таблицы.
 
  • Спасибо
Реакции: doc

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
единственной, 1й дубль так не удалится
Ну возможно в екселе можно так удалить. Надо уточнить этот момент.

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

6. Собираем все обратно в отдельные таблицы.
Ага только в шарпе я не очень)) Кубы решают )))
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 084
Благодарностей
339
Баллы
83
В таблицах одинаковое количество столбцов?
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 166
Благодарностей
2 167
Баллы
113

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113

Шива

Client
Регистрация
05.02.2018
Сообщения
1 084
Благодарностей
339
Баллы
83
Это можно сделать средствами екселя
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 084
Благодарностей
339
Баллы
83
Склеиваешь все файлы в 1.
В екселе в условном форматировании подсвечиваешь уникальные строки в столбце.
Раскидываешь обратно по файлам.
Потом ищешь как удалить помеченные строки.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Склеиваешь все файлы в 1.
В екселе в условном форматировании подсвечиваешь уникальные строки в столбце.
Раскидываешь обратно по файлам.
Потом ищешь как удалить помеченные строки.
Вот уже ситуация проясняется)
 

Мирон

Client
Регистрация
15.10.2015
Сообщения
29
Благодарностей
8
Баллы
3
Код:
var list2 = list1.GroupBy(x => x)
                            .Where(group => group.Count() == 1)
                                .Select(group => group.Key).ToList();
Так работает с List, удаляет и дубликат и оригинал.
 

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
391
Благодарностей
166
Баллы
43
Стартовые данные чьи дубли ищем в 1 таблице или же в каждой?
Например в таблице 1 есть вася в 3 строке,в таблице 5 он тоже есть значит удаляем из этих таблиц.Или же старт может быть в любой таблице?
Сформулируй последовательность действий словами.
Или должно сначала с первой таблици все строки взять по очереди и проверить в других таблицах,потом со второй взять все и т.д.?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Код:
var list2 = list1.GroupBy(x => x)
                            .Where(group => group.Count() == 1)
                                .Select(group => group.Key).ToList();
Так работает с List, удаляет и дубликат и оригинал.
Строковые дубли меня не интересуют. Мне надо удалять дубли в колонках.

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

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
391
Благодарностей
166
Баллы
43
Строковые дубли меня не интересуют. Мне надо удалять дубли в колонках.


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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Всегда в 1 столбце ищем?Если нашли то удаляем всю строку?
Ну да в одном. Столбец телефоны, всегда в нем телефоны.
Строку всю обязательно иначе таблица сместится.

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

@Vlad_Curnoi Просто так спросил или хочешь меня обрадовать?))
 
Последнее редактирование:

Vlad_Curnoi

Client
Регистрация
09.08.2017
Сообщения
391
Благодарностей
166
Баллы
43
Ну да в одном. Столбец телефоны, всегда в нем телефоны.
Строку всю обязательно иначе таблица сместится.

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

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

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Да вот задачка интересная,вот думаю как вариант 2 таблицы создать,их привязвыать по очереди к файлу,после искать.Не пойму зачем куча таблиц если данные похожи?
Данные разные, но я где-то косячнул и данные записались не туда куда нужно. И теперь надо их удалить. Вроде даже строки одинаковые, может тогда строками можно почистить дубли если так не получается. Создавать таблицы новые я не хочу я уже и так руками провозился много с ними, что бы привести в приемлемый вид, осталось только с дублями разобраться и все.
 

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
http://zennolab.com/discussion/threads/udalit-dubli-v-neskolkix-tablicax-po-odnomu-stolbcu.48561/
Строковые дубли меня не интересуют. Мне надо удалять дубли в колонках.
Так запихните колонку в список, создайте класс для листа с индексом таблицы и поудаляйте дубли, залейте назад по таблицам. Порядок строк должен сохраниться?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
пример в студию )
Код:
    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, там все просто и быстро.
 

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