PDA

Показать полную графическую версию : [решено] Сравнение файлов+добавить вычисляемое поле


solonenko
18-03-2020, 10:30
Добрый день. Прошу помощи в реализации такой задачи
Робот проводит обзвон клиентов - есть данные результата обзвона. Сейчас обычный txt без заголовков.
Статус звонка,дата,время,номер телефона.

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, с заголовками Дата+время звонка, Номер телефона

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
solonenko, сделайте тестовые файлы, с реальной структурой, прикрепите их сюда...

solonenko
18-03-2020, 12:04
Приношу извинения, данные АТС выгружает в csv, а не xls

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

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

Iska
18-03-2020, 23:52
solonenko, осталось рассказать, как из:
seen;16.03.2020;13:06:26;79000000001
и:
16.03.2020 16:57;79000000001
получается:
79000000001;30

YuS_2
19-03-2020, 05:16
в 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
YuS_2, большое спасибо! Все отлично работает.
данным пример кода подстегивает меня развиваться дальше в направлении изучения PowerShell :)

solonenko
20-03-2020, 13:25
$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
Так, наверное:

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

solonenko
20-03-2020, 13:52
DJ Mogarych
Получается в данной задаче это лучше делать уже на этапе выбора строк, а я пытался до.
Спасибо, работает.




© OSzone.net 2001-2012