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

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

Ответить
Настройки темы
PowerShell - [решено] Сравнение файлов+добавить вычисляемое поле

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


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

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


Добрый день. Прошу помощи в реализации такой задачи
Робот проводит обзвон клиентов - есть данные результата обзвона. Сейчас обычный 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

Отправлено: 10:30, 18-03-2020

 

Аватара для YuS_2

Crazy


Contributor


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

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


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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:14, 18-03-2020 | #2



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

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


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


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

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


Вложения
Тип файла: zip files.zip
(481 байт, 6 просмотров)

Приношу извинения, данные АТС выгружает в csv, а не xls

Отправлено: 12:04, 18-03-2020 | #3


Аватара для YuS_2

Crazy


Contributor


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

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


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

-------
scio me nihil scire. Ѫ


Отправлено: 17:18, 18-03-2020 | #4


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


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

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


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

Отправлено: 22:24, 18-03-2020 | #5


Ветеран


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

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


solonenko, осталось рассказать, как из:
Код: Выделить весь код
seen;16.03.2020;13:06:26;79000000001
и:
Код: Выделить весь код
16.03.2020 16:57;79000000001
получается:
Код: Выделить весь код
79000000001;30

Отправлено: 23:52, 18-03-2020 | #6


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата 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

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

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


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


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

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


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

Отправлено: 10:32, 19-03-2020 | #8


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


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

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


Код: Выделить весь код
$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

Отправлено: 13:25, 20-03-2020 | #9


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Так, наверное:
Код: Выделить весь код
select @{n='Phone';e={$_.src -replace "^8","7"}},@{n='Date';e={get-date $_.calldate}} |sort phone,date

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:36, 20-03-2020 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Сравнение файлов Asdshka Скриптовые языки администрирования Windows 7 12-12-2018 15:42
PowerShell - [решено] Сравнение 2 файлов Johny_spb Скриптовые языки администрирования Windows 8 16-12-2016 14:12
Любой язык - Сравнение списка файлов и каталога с файлами с копированием файлов из каталога jastreb83 Скриптовые языки администрирования Windows 0 10-04-2013 09:56
2010 - [решено] Добавить все контакты в поле "Кому" exo Microsoft Office (Word, Excel, Outlook и т.д.) 2 13-12-2011 19:30
Сравнение файлов Guest Программирование и базы данных 6 24-04-2004 04:47




 
Переход