Компьютерный форум 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=344461)

solonenko 18-03-2020 10:30 2913670

Сравнение файлов+добавить вычисляемое поле
 
Добрый день. Прошу помощи в реализации такой задачи
Робот проводит обзвон клиентов - есть данные результата обзвона. Сейчас обычный txt без заголовков.
Статус звонка,дата,время,номер телефона.
Пример 1 файла

seen;16.03.2020;13:06:26;79000000001
undelivered;16.03.2020;13:06:36;79000000002
undelivered;16.03.2020;13:07:15;79000000003
seen;16.03.2020;13:08:26;79000000004
seen;16.03.2020;13:08:56;79000000005

С атс получаю данные о входящих звонках за период. Данные в xls, с заголовками Дата+время звонка, Номер телефона
Пример 2 файла

calldate src
16.03.2020 16:59 79000000006
16.03.2020 16:58 79000000007
16.03.2020 16:58 79000000008
16.03.2020 16:57 79000000001
16.03.2020 16:57 79000000003
16.03.2020 16:57 79000000004
16.03.2020 16:57 79000000009
16.03.2020 16:57 79000000002


Задача: Узнать, сколько клиентов перезвонили и через какое время.
По сути получается сделать сравнение файлов по номеру телефона, выбрать из 2-го файла строки, имеющиеся в первой файле, добавить вычисляемое поле (разность времени).
Вывод вижу примерно так:
Скрытый текст

Phone Time,sec
79000000001 30
79000000002 46
79000000003 150

Всего перезвонили: 3


Немного почитал про Compare-Object - подойдет ли он для данной задачи? Или же тут лучше делать через foreach и пробежать по двум файлам?
Сама стратегия реализации пока не ясна :(

1 файл делаю я, можно добавить заголовки (я так понимаю если использовать Compare-Object ), или же убрать заголовки во 2 файле (если использовать foreach )
В моем случае файлы читать через Get-Content, или сделать импорт?
Если импорт, то Import-Csv для обоих файлов? (и txt и xls)
Сори за некоторый сумбур. Интуитивно понимаю, что есть несколько методов решения задачи, но какие применить здесь удобнее/правильнее/эффективнее
В 1 файле до 1000 строк, во 2 - до 200

YuS_2 18-03-2020 11:14 2913679

solonenko, сделайте тестовые файлы, с реальной структурой, прикрепите их сюда...

solonenko 18-03-2020 12:04 2913686

Вложений: 1
  • files.zip (481 bytes, скачиваний: 16)
Приношу извинения, данные АТС выгружает в csv, а не xls

YuS_2 18-03-2020 17:18 2913730

solonenko,
Количество звонков по одному исходящему и одному входящему? Т.е. номера телефонов, в каждом списке - уникальные данные или нет?
seen/undelivered - на что-нибудь влияют?
В общем, пока маловато данных...

solonenko 18-03-2020 22:24 2913777

YuS_2,
в рамках 1 дня мы звоним 1 раз, т.о. в out.txt - уникальные номера.
клиент может звонить и несколько раз, т.о. в in.csv могут быть повторения номера, однако достаточно поймать 1-й входящий по времени. Следующие входящие от этого клиента это уже не реакция на бота.
seen/undelivered - статус звонка - в данной задаче не влияет

Iska 18-03-2020 23:52 2913791

solonenko, осталось рассказать, как из:
Код:

seen;16.03.2020;13:06:26;79000000001
и:
Код:

16.03.2020 16:57;79000000001
получается:
Код:

79000000001;30

YuS_2 19-03-2020 05:16 2913807

Цитата:

Цитата solonenko
в out.txt - уникальные номера.
клиент может звонить и несколько раз, т.о. в in.csv могут быть повторения номера, однако достаточно поймать 1-й входящий по времени. Следующие входящие от этого клиента это уже не реакция на бота.
seen/undelivered - статус звонка - в данной задаче не влияет »

Получается, что входящие без соответствующего исходящего, просто игнорируем.
Тогда, примерно так:
Код:

$outsrc = 'out.txt'
$insrc = 'in.csv'
$result = 'res.csv'

$out = ipcsv $outsrc -d ';' -h 'Status','Date','Time','Phone'|
select Phone,@{n='Date';e={get-date($_.date+' '+$_.time)}} |sort phone -uni

$in = ipcsv $insrc -d ';'|
select @{n='Phone';e={$_.src}},@{n='Date';e={get-date $_.calldate}} |sort phone,date

$out|%{
        [pscustomobject]@{
                'Phone' = $_.phone
                'CallBackDiff' = if(($i=[array]::indexof($in.phone,$_.phone)) -ne -1){
                        ($in[$i].date - $_.date).totalseconds
                } else {$null}
        }
}|?{$_.callbackdiff -ne $null}|export-csv $result -d ';' -notype


solonenko 19-03-2020 10:32 2913841

YuS_2, большое спасибо! Все отлично работает.
данным пример кода подстегивает меня развиваться дальше в направлении изучения PowerShell :)

solonenko 20-03-2020 13:25 2914009

Код:

$in = ipcsv $insrc -d ';'|
select @{n='Phone';e={$_.src}},@{n='Date';e={get-date $_.calldate}} |sort phone,date

Тут все ок сейчас.
При сравнения номеров телефонов столкнулся с проблемой:
в файле out.txt все номера тел. имеют префикс 7
в in.csv - многие 8.
Для корректного сравнения нужно поменять первую цифру 8 на 7

Код:

$in = Import-Csv $insrc -d ';'
foreach ($bird in $in) {$bird.src = $bird.src -replace('^8','7')}

Но тогда как передать дальше по конвейеру измененный массив, чтобы выполнить
select @{n='Phone';e={$_.src}},@{n='Date';e={get-date $_.calldate}} |sort phone,date

DJ Mogarych 20-03-2020 13:36 2914012

Так, наверное:
Код:

select @{n='Phone';e={$_.src -replace "^8","7"}},@{n='Date';e={get-date $_.calldate}} |sort phone,date

solonenko 20-03-2020 13:52 2914014

DJ Mogarych
Получается в данной задаче это лучше делать уже на этапе выбора строк, а я пытался до.
Спасибо, работает.


Время: 23:31.

Время: 23:31.
© OSzone.net 2001-