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

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

solonenko 14-02-2020 12:38 2909509

Powershell_поиск одинаковых значений массива
 
Добрый день.
Через сервис рассылки отправляются текстовые уведомления о заказе. они доставляется/(не доставлены/просмотрены/...) в каналы: sms/viber/vk
Имеется .txt файл, содержащий уникальные mid отправленного информационного сообщения.
Для проверки статуса читаю файл, беру оттуда mid, отправляю в foreach и методом Invoke-RestMethod делаю запрос на получения статуса имеющихся mid
Пример ответа сервера по каждой строке:

PS C:\WINDOWS\system32> $a

log : {@{_id=5e46429b2a955d000be61afa; status=query; when=2020-02-13T07:00:05.978Z}}
mid : 17a4b6b5-0bb9-4557-916f-f0775839d474
lastStatusUpdate : 2020-02-13T07:03:14.499Z
status : delivered
code : 7
channel : sms
type : primary

code может принимать 5 значений, channel может принимать 3. Итого 15 разных вариантов
Начал считать с цикле (проверка по 2-м условиям) но явно это не рационально для всех комбинаций
Как вариант - вижу отправить $a.channel+ " " +$a.status в текстовый файл и там посчитать совпадения, но тоже как-то "костыльно"

Как правильно подсчитать количество полученных ответов в комбинации code+channel, чтобы было примерно так:

channel code count
sms 7 2
sms 6 4
viber 7 10
.................

DJ Mogarych 14-02-2020 12:55 2909514

Цитата:

Цитата solonenko
code может принимать 5 значений, channel может принимать 3. Итого 15 разных вариантов »

Вы бы выложили побольше вариантов, а то получается, что надо их самому рисовать, это неинтересно.

solonenko 14-02-2020 13:11 2909519

Цитата:

Цитата DJ Mogarych
Вы бы выложили побольше вариантов, а то получается, что надо их самому рисовать, это неинтересно. »

ТАБЛИЦА СООТВЕТСТВИЯ СТАТУСОВ
Код Название статуса Описание статуса
10 interact Взаимодействие пользователя с сообщением (нажата кнопка, отправлено ответное сообщение). Возможен только для акцептированных контактов.
9 seen Сообщение прочитано
7 delivered Сообщение доставлено
6 undelivered Сообщение не удалось доставить
5 expired Время ожидания доставки сообщения истекло

возможные значения параметра channel: sms/viber/vk

т.о.
для sms-возможны статусы 7,6,5
для viber/vk - возможны все 5 статусов
Итого 13 комбинаций. Перебирать if/elseif мне думается сложно и запутанно, да еще и счетчики каждой итерации...

DJ Mogarych 14-02-2020 13:20 2909522

Я имел в виду этих вариантов, чтобы было что импортировать:
Код:

log : {@{_id=5e46429b2a955d000be61afa; status=query; when=2020-02-13T07:00:05.978Z}}
mid : 17a4b6b5-0bb9-4557-916f-f0775839d474
lastStatusUpdate : 2020-02-13T07:03:14.499Z
status : delivered
code : 7
channel : sms
type : primary

Лучше всего - оригинальные файлы, из которых вы берёте данные.

solonenko 14-02-2020 13:49 2909531

Цитата:

Цитата DJ Mogarych
Лучше всего - оригинальные файлы, из которых вы берёте данные. »

Это не файлы, а ответ сервера.
Скрытый текст

Код:

log              : {@{_id=5e466d132a955d000be83ac1; status=delivered; when=2020-02-14T06:31:14.471Z}, @{_id=5e466d132a955d000be83ac0; status=query; when=2020-02-14T06:30:14.719Z}}
mid              : 4e7eea88-315e-4bc8-bd9b-8db5237a03b2
lastStatusUpdate : 2020-02-14T09:43:06.966Z
status          : seen
code            : 9
channel          : viber
type            : accepted

log              : {@{_id=5e466d132a955d000be83ac5; status=query; when=2020-02-14T06:30:16.358Z}}
mid              : 1bb94f6b-34d2-4d70-99a4-8d89d8cfc83c
lastStatusUpdate : 2020-02-14T06:30:20.965Z
status          : delivered
code            : 7
channel          : viber
type            : primary

log              : {@{_id=5e466d132a955d000be83aca; status=seen; when=2020-02-14T06:30:46.689Z}, @{_id=5e466d132a955d000be83ac9; status=delivered; when=2020-02-14T06:30:35.487Z}, @{_id=5e466d132a955d000be83ac8; status=query; when=2020-02-14T06:30:16.061Z}}
mid              : 609e839b-3605-402f-aaca-9772fc3e5dbc
lastStatusUpdate : 2020-02-14T06:31:02.371Z
status          : interact
code            : 10
channel          : viber
type            : accepted

log              : {@{_id=5e466d132a955d000be83ad0; status=query; when=2020-02-14T06:50:17.859Z}}
mid              : cb656a30-de70-4cd5-8be7-cc76e07d9b03
lastStatusUpdate : 2020-02-14T06:50:19.876Z
status          : delivered
code            : 7
channel          : sms
type            : primary

log              : {@{_id=5e466d132a955d000be83ad7; status=seen}, @{_id=5e466d132a955d000be83ad6; status=delivered; when=2020-02-14T06:50:26.680Z}, @{_id=5e466d132a955d000be83ad5; status=query; when=2020-02-14T06:50:16.434Z}}
mid              : fa1c05b6-ff99-4b14-b78d-2e2ee0b22114
lastStatusUpdate : 2020-02-14T07:13:49.026Z
status          : interact
code            : 10
channel          : vk
type            : primary

log              : {@{_id=5e466d132a955d000be83add; status=query; when=2020-02-14T06:50:28.940Z}}
mid              : 9a6a25fc-42ed-4d5f-923e-c3ed0a7f1dfb
lastStatusUpdate : 2020-02-14T06:50:32.923Z
status          : delivered
code            : 7
channel          : sms
type            : primary

log              : {@{_id=5e466d132a955d000be83ae2; status=seen; when=2020-02-14T06:31:11.350Z}, @{_id=5e466d132a955d000be83ae1; status=delivered; when=2020-02-14T06:30:19.407Z}, @{_id=5e466d132a955d000be83ae0; status=query; when=2020-02-14T06:30:16.549Z}}
mid              : 03c9745c-e3b1-499a-907c-f6f02a214bfe
lastStatusUpdate : 2020-02-14T06:31:22.884Z
status          : interact
code            : 10
channel          : viber
type            : accepted

log              : {@{_id=5e466d132a955d000be83ae8; status=query; when=2020-02-14T06:50:17.760Z}}
mid              : 83d42465-139d-41fa-9358-3808c83c807f
lastStatusUpdate : 2020-02-14T06:50:21.883Z
status          : delivered
code            : 7
channel          : sms
type            : primary

log              : {@{_id=5e466d132a955d000be83aee; status=query; when=2020-02-14T06:35:18.089Z}}
mid              : ae6d2b8e-baa0-4a86-a736-bc7102e5e652
lastStatusUpdate : 2020-02-14T06:35:22.334Z
status          : delivered
code            : 7
channel          : sms
type            : primary

log              : {@{_id=5e466d132a955d000be83af4; status=delivered; when=2020-02-14T06:50:23.293Z}, @{_id=5e466d132a955d000be83af3; status=query; when=2020-02-14T06:50:16.989Z}}
mid              : 327f532f-abd0-42f5-9753-c192c1120b8e
lastStatusUpdate : 2020-02-14T06:50:36.575Z
status          : seen
code            : 9
channel          : vk
type            : primary

log              : {@{_id=5e466d132a955d000be83afa; status=query; when=2020-02-14T06:30:18.710Z}}
mid              : 6248ed00-1943-4f3d-9c65-d302c2875afc
lastStatusUpdate : 2020-02-14T06:30:42.822Z
status          : undelivered
code            : 6
channel          : sms
type            : primary

log              : {@{_id=5e466d132a955d000be83aff; status=seen; when=2020-02-14T06:31:59.272Z}, @{_id=5e466d132a955d000be83afe; status=delivered; when=2020-02-14T06:31:30.791Z}, @{_id=5e466d132a955d000be83afd; status=query; when=2020-02-14T06:30:17.075Z}}
mid              : 79533b7c-4eb1-481d-9203-ada703a4513d
lastStatusUpdate : 2020-02-14T06:32:03.919Z
status          : interact
code            : 10
channel          : viber
type            : accepted



Я беру txt-файл(лог отправки), в нем каждый mid отправляю на проверку статуса - получаю ответ.
Задача: сделать статистику по каналам доставки и статусу

DJ Mogarych 14-02-2020 14:43 2909545

А сервер это возвращает как простой текст?

solonenko 14-02-2020 15:02 2909548

Цитата:

Цитата DJ Mogarych
А сервер это возвращает как простой текст? »

Код:

$a= Invoke-RestMethod  -Uri "https://sd.flomni.com/status/?data=+$($find[0])" -ContentType "application/json; charset=utf-8" -Headers $headers_voice -Method Get

Код:

PS C:\WINDOWS\system32> $a
log              : {@{_id=5e466d132a955d000be83aff; status=seen; when=2020-02-14T06:31:59.272Z}, @{_id=5e466d132a955d000be83afe; status=delivered; when=2020-02-14T06:31:30.791Z}, @{_id=5e466d132a955d000be83afd; status=query; when=2020-02-14T06:30:17.075Z}}
mid              : 79533b7c-4eb1-481d-9203-ada703a4513d
lastStatusUpdate : 2020-02-14T06:32:03.919Z
status          : interact
code            : 10
channel          : viber
type            : accepted

Код:

PS C:\WINDOWS\system32> $a.GetType()

IsPublic IsSerial Name                                    BaseType                                                                                                                                                                                                                         
-------- -------- ----                                    --------                                                                                                                                                                                                                         
True    True    Object[]                                System.Array

Есть txt файл с mid. Беру его, извлекаю mid-даю запрос-получаю ответ сервера в виде массива.
В файле допустим 100 mid. Хочу посчитать, сколько из них доставлены, в какие каналы и какой статус последний.

DJ Mogarych 14-02-2020 16:01 2909559

Формируете массив из ответов сервера на каждый mid, а потом что-то вроде
Код:

$array |group channel,code -NoElement

Count Name                   
----- ----                   
    1 viber, 9               
    1 viber, 7               
    3 viber, 10               
    4 sms, 7                 
    1 vk, 10                 
    1 vk, 9                   
    1 sms, 6


solonenko 14-02-2020 16:44 2909568

Цитата:

Цитата DJ Mogarych
Формируете массив из ответов сервера на каждый mid, а потом что-то вроде »

Знаний не много этой области, уточните пожалуйста.
Получается до foreach я создаю пустой массив. Затем в цикле каждый ответ, в моем случае $a, добавляю в массив. После окончания цикла вывожу $array. Верно понимаю решение?

DJ Mogarych 14-02-2020 18:55 2909595

Цитата:

Цитата solonenko
Есть txt файл с mid. Беру его, извлекаю mid-даю запрос-получаю ответ сервера в виде массива.
В файле допустим 100 mid. »

Для файла вы пишете $array = foreach ($строка in $файл) {чего-то там}, который запрашивает сервер и формирует массив, где будут все результаты. Дальше вы уже группируете.

solonenko 17-02-2020 10:25 2909840

DJ Mogarych,
Спасибо, все получилось


Время: 02:05.

Время: 02:05.
© OSzone.net 2001-