Показать полную графическую версию : Группировка чисел
Приветствую всех гуру мастеров может кто сможет помочь так как сам я ещё новечёк в powershell но есть задача в которой я застрял на одном пункте.
Получен массив данных из четырёх значных чисел
для примера пусть будут
1021
1022
1023
1024
1025
1026
1027
1031
1032
1033
1034
1035
1036
1037
их нужно сгруппировать и получить результат
102[1-7]
103[1-7]
И в результате т.к. они имеют разницу в одной цифре
10[23][1-7]
Может найдутся те кто знает как это сделать, очень буду благодарен тк не своими силами не через поиск нечего найти не могу или не там ищу.
А на данном форуме не раз находил что-нибудь полезное, может кто-нибудь сможет побороть и мою проблему.
DrBuG47, каким должен быть результат?
каким должен быть результат? »
Как и писал выше в результате числа должны сложится в своего рода маску 10[23][1-7]
Нужно сгруппировать числа по схожим цифрам начиная с последних
если три первых цифры одинаковые как в примере 123 то остальные он собирает в квадратные кавычки [1234567] а если они идут подряд то упрощает до 1-7
после такой сборки переход ко второй цифре уже поиск по 10*[1-7] если три значения одинаковые собирает 10[23][1-7]
На выходе при сборе всех данных будет что то типа 10[23][1-7],123[579],21[125]0,357[0-9],42[13][13456]
это сбор внутренних номеров телефонов из AD для автоматизации маршрутов в телефонии
Я уже сделал всё кроме этого и не хотелось бы бросать огромную работу только из за одной проблемы
даже если получится собрать без упрощения типа 10[23][1234567] это уже что-то
Я уже над этим давно бьюсь и нечего не нашёл
Скажем так: к «группировке чисел» это имеет очень опосредованное отношение.
А вот это:
21[125]0, »
из чего должно было получиться?!
И что, например, должно получиться из вот такого набора:
1021
1022
1027
1031
1033
1034
1037
из чего должно было получиться?! »
Уже выгруженные и обработанные данные из AD в массив допустим $phone
из чего должно было получиться?! »
1021
1022
1027
1031
1033
1034
1037
результат будет таким: 102[127],103[1347]
Получен массив данных из четырёх значных чисел »
это сбор внутренних номеров телефонов »
Номера телефонов - не числа.
Простого красивого общего решения у вашей задачи нет. Либо довольствоваться первым попавшимся результатом, либо формировать множество решений, а потом выбирать из них лучшее.
Поэтому пишите, как получится, без перфекционизма.
Foreigner
21-05-2020, 19:04
результат будет таким: 102[127],103[1347] »
$a = 1020..1039
$res = [ordered] @{}
foreach ($i in $a)
{
$key, $value = $($i -replace '^(\d+)(\d)$','$1 $2').split()
if ($value -notmatch '[089]')
{ $res.$key += "$value" }
}
$report =
foreach ($i in $res.keys) { "$i[$($res.$i)]" }
$report -join ','
$a = 1020..1039
$res = [ordered] @{}
foreach ($i in $a)
{
$key, $value = $($i -replace '^(\d+)(\d)$','$1 $2').split()
if ($value -notmatch '[089]')
{ $res.$key += "$value" }
}
$report =
foreach ($i in $res.keys) { "$i[$($res.$i)]" } »
Спасибо, теперь хоть есть от чего отталкиваться
greg zakharov
24-05-2020, 18:28
(1021..1039 | Group-Object {
$s = [String]$_;$s.Substring(0, $s.Length - 1)
} | Select-Object @{
N='Name';E={"$($_.Name)[$(-join$_.Group.ForEach{([String]$_)[-1]})]"}
}).Name
Итог:
102[123456789]
103[0123456789]
Если нужны именно диапазоны вроде [1-7] или нечто в этом роде, можно выкинуть select и жахнуть linq'ом.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.