Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Группировка чисел

Ответить
Настройки темы
PowerShell - Группировка чисел

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 16:00, 21-05-2020

 

Ветеран


Contributor


Сообщения: 26109
Благодарности: 7601

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:19, 21-05-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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] это уже что-то
Я уже над этим давно бьюсь и нечего не нашёл

Последний раз редактировалось DrBuG47, 21-05-2020 в 17:46.


Отправлено: 17:09, 21-05-2020 | #3


Ветеран


Contributor


Сообщения: 26109
Благодарности: 7601

Профиль | Отправить PM | Цитировать


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

А вот это:
Цитата DrBuG47:
21[125]0, »
из чего должно было получиться?!

И что, например, должно получиться из вот такого набора:
Код: Выделить весь код
1021
1022
1027
1031
1033
1034
1037

Отправлено: 17:54, 21-05-2020 | #4


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
из чего должно было получиться?! »
Уже выгруженные и обработанные данные из AD в массив допустим $phone

Цитата Iska:
из чего должно было получиться?! »
Код: Выделить весь код
1021
1022
1027
1031
1033
1034
1037

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

Отправлено: 18:07, 21-05-2020 | #5


Ветеран


Сообщения: 3518
Благодарности: 754

Профиль | Отправить PM | Цитировать


Цитата DrBuG47:
Получен массив данных из четырёх значных чисел »
Цитата DrBuG47:
это сбор внутренних номеров телефонов »
Номера телефонов - не числа.

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

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

Отправлено: 19:01, 21-05-2020 | #6


Ветеран


Сообщения: 1587
Благодарности: 880

Профиль | Цитировать


Цитата 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 ','
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:04, 21-05-2020 | #7


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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)]" }
»
Спасибо, теперь хоть есть от чего отталкиваться

Отправлено: 19:21, 21-05-2020 | #8


Ветеран


Сообщения: 574
Благодарности: 192

Профиль | Цитировать


Код: Выделить весь код
(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'ом.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:28, 24-05-2020 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Группировка чисел

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Группировка кнопок в таксбаре Gavabkv Microsoft Windows 7 0 03-03-2018 15:57
Интернет - Группировка эскизов-миниатюр. hakuro Microsoft Windows 8 и 8.1 1 26-04-2016 01:18
CMD/BAT - Группировка файлов r1sh Скриптовые языки администрирования Windows 5 09-02-2015 17:58
Интерфейс - Группировка окон grosmeba Microsoft Windows 7 2 23-06-2014 00:14
Разное - группировка окон fngidiotdonk Microsoft Windows 7 0 18-01-2011 22:25




 
Переход