Страницы: 1
RSS
Сортировка номеров телефонов по уникальности, Есть список номеров телефонов, его нужно отсортировать так чтобы номера друг за другом были наименее похожи
 
Здравствуйте.

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

Например есть номера

890 45 20
890 45 30
890 46 12
671 40 50
671 41 50

Вначале удобно перемешать номера внутри группы "890", так друг за другом будут идти разные номера:
890 45 20
890 46 12
890 45 30

Со второй группой это делать не надо она уникальна внутри группы "671".

После надо перемешать уже сами группы:
890 45 20
671 40 50
890 46 12
671 41 50
890 45 30

Руками это можно сделать, но номеров может быть и 100шт, в каждом по 11 цифр.

Можно ли как-то сделать это формулами или скриптом?

Пример реальных чисел (номера телефонов):
79166961104
79858063568
79166963019
79856684268
79166971599
79858063173
79166972558
79857136182
79166968153
79858060849
79166964986
79858062633
79166971343
79858062483
79166970165
79858063142
79166968806
79858062783
79167962460
79858062920
79167962372
79858064223
79166971597
79858063186
79165583503
79858060417
79150582552
79858063195
79167967066
79858061297
79167980184
79855796184
79167372391
79858063582
79167524158
79858062269
79166162102
79858062792
79165779188
 
Цитата
kdbled написал:
внутри группы "890",
с этих цифр начинается номер или это из середины?
 
Цитата
написал:
Цитата
kdbled написал:
внутри группы "890",
с этих цифр начинается номер или это из середины?
Номер начинается.  Уникальность проверяется слева направо.
 
Вдруг угадал.
А то блин, пояснение: "вот есть у нас 890 46 12", а потом "ну вот крч пример чисел 79166961104"  :D
Код
let
    f=(Источник as table,off as number, num as number, word as text) =>
    [   Sort = Table.Sort(Источник,{{"Столбец1", Order.Ascending}}),
        Group = Table.Group(Sort, "Столбец1", {"col", each Table.AddIndexColumn(_,"index"&word,1,1)}, 
             GroupKind.Local, 
             (s,c)=> Number.From( Text.Range(Text.From(s),off,num) <> Text.Range(Text.From(c),off,num))),
        Combine = Table.Combine(Group[col]),
        SortAgain = Table.Sort(Combine,{{"index"&word, Order.Ascending}}),
        Remove = Table.RemoveColumns(SortAgain, {"index"&word}),
        Index = Table.AddIndexColumn(Remove,"index"&word,1,1)
    ][Index],

    tbl = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    step1 = f(tbl,0,4,"one"),
    step2 = f(step1,4,3,"two"),
    step3 = f(step2,7,2,"three"),
    step4 = f(step3,9,2,"four"),
    step5 = Table.Sort(step4,
            {
                {"indexone", Order.Ascending}, 
                {"indextwo", Order.Ascending}, 
                {"indexthree", Order.Ascending}, 
                {"indexfour", Order.Ascending}
            }
    )[[Столбец1]]
in
    step5
Изменено: whateverlover - 04.10.2022 23:14:46
 
Значения остались очень родственными.

Например идет подряд 79165. Да они идут через одну строку, но фактически друг за другом.
Изменено: kdbled - 04.10.2022 23:32:52
 
Цитата
написал:
Вдруг угадал.

Если есть желание проработать скрипт до победного за небольшую мзду, я готов проспонсировать.
Мне он нужен в коммерческих целях.
 
kdbled, я уже делаю — подождите :)
UPD: Готово
Для запуска макроса - даблклик по ячейке A1.
Работает с любыми данными. Сортировка осуществляется в VBA.

Принцип: нечётные значения заполняем с начала отсортированного массива, а чётные - с его середины (с учётом чётности/нечётности количества элементов массива).

Название темы: Перемешать данные, чтобы 2 соседних значения не были похожи
Изменено: Jack Famous - 05.10.2022 11:17:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Пример реальных чисел (номера телефонов):
Или я чего-то не догоняю, но почему нельзя применить стандартную функцию сортировки ексел?
Он же так и отсортирует сначала по коду а потом все номера
 
Цитата
Александр Моторин: почему нельзя применить стандартную функцию сортировки ексел?
потому что сортировка НЕ ДОЛЖНА быть по порядку
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Готово
Сейчас проверю.

Зачем Вы так режете форматирование ячеек. Это же был просто пример из значений.

Классические экселевские ячейки куда красивее пустынных белых полей.
 
Цитата
написал:
Для запуска макроса - даблклик по ячейке A1.
Тут же та же ошибка, что и у предыдущего пользователя.

Буквально по 4 цифре идут подряд цифры 5.
Задача куда сложнее чем Вам кажется.

Тут нужна работа с множественным вложением групп.
 
Цитата
kdbled: Классические экселевские ячейки куда красивее пустынных белых полей
вы не можете сделать, как вам нужно или считаете, что всем так удобно?

Цитата
kdbled:та же ошибка … по 4 цифре идут подряд цифры 5. Задача куда сложнее
удачи в реализации!  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Буквально по 4 цифре идут подряд цифры 5.
Хмм
А как должно біть?
На примере кода 791 покажите чтобы по 4 цифре не было подряд идущих цифр  6
Если там всего одна цифра 5
79166961104
79166963019
79166971599
79166972558
79166968153
79166964986
79166971343
79166970165
79166968806
79167962460
79167962372
79166971597
79165583503
79150582552
79167967066
79167980184
79167372391
79167524158
79166162102
79165779188
 
Цитата
kdbled написал:
Задача куда сложнее чем Вам кажется.
8-0
так опишите ее уже
можно на примере Александр Моторин
если одно число на какой-то позиции в ваших примерах превалирует над другими, оно неизбежно будет иногда встречаться само с собой
могу вечером попробовать по каждой отдельной цифре сделать сотртировку, просто тс сам попросил по каким-то группам сортировать, потом еще и не доволен(
Изменено: whateverlover - 05.10.2022 14:34:42
Страницы: 1
Наверх