Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Группировка чисел (http://forum.oszone.net/showthread.php?t=345264)

DrBuG47 21-05-2020 16:00 2922047

Группировка чисел
 
Приветствую всех гуру мастеров может кто сможет помочь так как сам я ещё новечёк в 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]

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

Iska 21-05-2020 16:19 2922050

DrBuG47, каким должен быть результат?

DrBuG47 21-05-2020 17:09 2922063

Цитата:

Цитата Iska
каким должен быть результат? »

Как и писал выше в результате числа должны сложится в своего рода маску 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] это уже что-то
Я уже над этим давно бьюсь и нечего не нашёл

Iska 21-05-2020 17:54 2922072

Скажем так: к «группировке чисел» это имеет очень опосредованное отношение.

А вот это:
Цитата:

Цитата DrBuG47
21[125]0, »

из чего должно было получиться?!

И что, например, должно получиться из вот такого набора:
Код:

1021
1022
1027
1031
1033
1034
1037


DrBuG47 21-05-2020 18:07 2922076

Цитата:

Цитата Iska
из чего должно было получиться?! »

Уже выгруженные и обработанные данные из AD в массив допустим $phone

Цитата:

Цитата Iska
из чего должно было получиться?! »

Код:

1021
1022
1027
1031
1033
1034
1037

результат будет таким: 102[127],103[1347]


Busla 21-05-2020 19:01 2922087

Цитата:

Цитата DrBuG47
Получен массив данных из четырёх значных чисел »

Цитата:

Цитата DrBuG47
это сбор внутренних номеров телефонов »

Номера телефонов - не числа.

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

Поэтому пишите, как получится, без перфекционизма.

Foreigner 21-05-2020 19:04 2922088

Цитата:

Цитата DrBuG47
результат будет таким: 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 ','


DrBuG47 21-05-2020 19:21 2922091

Цитата:

Цитата Foreigner
Код:

$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 2922439

Код:

(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'ом.


Время: 08:22.

Время: 08:22.
© OSzone.net 2001-