none
Powershell подсчет суммы одинаковых значений RRS feed

  • Вопрос

  • День добрый,
    помогите разобраться.
    Есть таблица, (источник). Необходимо посчитать кол-во каждого (CallerID) за каждый день месяца. 

    CallerID Destination Disposition Duration App Date
    222 XXX ANSWERED 0:00 Dial 05.12.2016
    233 XXX ANSWERED 0:18 Dial 05.12.2016

    XXX ANSWERED 0:03 Dial 05.12.2016

    XXX ANSWERED 0:02 Dial 05.12.2016

    XXX ANSWERED 0:03 Dial 05.12.2016
    100 XXX ANSWERED 0:07 Dial 05.12.2016
    311 XXX ANSWERED 0:01 Dial 05.12.2016
    100 XXX ANSWERED 0:10 Dial 05.12.2016
    203 XXX ANSWERED 0:00 Dial 05.12.2016
    233 XXX ANSWERED 0:00 Dial 05.12.2016


    И результат занести в таблицу. Рис. ниже. Т.е. №100 - 01.12.2016 = 4, и т.д.

    PHONE # 01.12.2016 02.12.2016
    100                    4 1                    
    210                   12  4                    
    203 ... ....
    233 ... ....
    311 .... ....
    244 .... ....



    Уже голову себе сломал, пытаюсь реализовать через многомерный массив. Но ....
    Кода, даже приблизительно рабочего нет. Запутался. Или хотя бы подскажите алгоритм.

    заранее спасибо.

    13 декабря 2016 г. 9:55

Ответы

  • $data = Get-Content C:\poshdata\sAsterisk_14122016.csv | Foreach {$_ -replace ";;",";"} | ConvertFrom-Csv -Delimiter ";" 
    $data | Where {$_."Имя звонящего".Trim() -match "^\d{3}$"} | Group "Имя звонящего","Дата звонка" -NoElement
    

    • Помечено в качестве ответа KazunEditor 19 декабря 2016 г. 5:49
    14 декабря 2016 г. 11:13
    Отвечающий

Все ответы

  • Файл формата:

    "CallerID","Destination","Disposition","Duration","App","Date"
    "222","XXX","ANSWERED","0:00","Dial","05.12.2016"
    "233","XXX","ANSWERED","0:18","Dial","05.12.2016"
    "XXX","ANSWERED","0:03","Dial",,"05.12.2016"
    "XXX","ANSWERED","0:02","Dial",,"05.12.2016"
    "XXX","ANSWERED","0:03","Dial",,"05.12.2016"
    "100","XXX","ANSWERED","0:07","Dial","05.12.2016"
    "311","XXX","ANSWERED","0:01","Dial","05.12.2016"
    "100","XXX","ANSWERED","0:10","Dial","05.12.2016"
    "203","XXX","ANSWERED","0:00","Dial","05.12.2016"
    "233","XXX","ANSWERED","0:00","Dial","05.12.2016"
    

    Скрипт:

    PS (STA) > Import-Csv 2.csv | Group CallerID,Date -NoElement
    
    Count Name
    ----- ----
        1 222, 05.12.2016
        2 233, 05.12.2016
        3 XXX, 05.12.2016
        2 100, 05.12.2016
        1 311, 05.12.2016
        1 203, 05.12.2016

    • Предложено в качестве ответа Vector BCOModerator 13 декабря 2016 г. 13:39
    13 декабря 2016 г. 10:07
    Отвечающий
  • Спасибо,
    но всё равно не могу понять

    $wb1.SaveAs($savePath,6) - вот таким образом сохраняю csv из эселя. CSV имеет формат:

    Дата звонка;  Имя звонящего;  ;Куда звонил;  ;Статус звонка;  Длительность;  App;Входящий номер;  Id`s
    01.12.2016 0:00; ххххххххххх; ;xxx; ; ANSWERED; 0:05:05; Dial; -; 1480614211.19788
    01.12.2016 0:00; ххх; ;xxxxxxxxxx; ; NO ANSWER; 0:00:32; Dial; -; 1480613922.19783
    01.12.2016 0:00; ххх; ;xxxxxxxxxx; ; ANSWERED; 0:01:57; Dial; -; 1480613248.19781
    01.12.2016 0:00; ххx; ;xxxxxxxxxx; ; ANSWERED; 0:01:11; Dial; -; 1480612720.19779

    при выполнении вашего командлета:

    Import-Csv $savePath | Group "Имя звонящего","Дата звонка" -NoElement #| Out-File($pathw)


    Выдает общее кол-во

    Count Name                     
    ----- ----                     
       37            

    Пробовал заменять; на ,
    Пробовал сохранять в разных форматах Юникод, Ютф

    результат тот же (


    • Изменено Tyuka 13 декабря 2016 г. 14:12
    13 декабря 2016 г. 14:00
  • Для кого я привожу формат файла с запятыми, а тут даже скопировать не могут правильно, сильно.

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

    PS (STA) > Import-Csv file.csv -Delimiter ";" | Group "Имя звонящего","Дата звонка" -NoElement
    WARNING: One or more headers were not specified. Default names starting with "H" have been
     headers.
    
    Count Name
    ----- ----
        1 ххххххххххх, 01.12.201...
        2 ххх, 01.12.2016 0:00
        1 хх, 01.12.2016 0:00


    • Изменено KazunEditor 13 декабря 2016 г. 14:17
    13 декабря 2016 г. 14:16
    Отвечающий
  • Ну уж извините,
    я пробовал и с запятыми, правда конвертил - вот так :

    Get-Content ($patht) | ForEach-Object {$_ -replace ';',','} | Set-Content ($patht) -Encoding Unicode
    Вот сама csv  13122016.csv

    Когда файл csv с запятыми, валит вот такую ошибку:

    -------------------------------------------------------------------
    Import-Csv : Cannot process argument because the value of argument "name" is invalid. Change the value of the "name" argu
    ment and run the operation again.
    At C:\Users\s.tyuznev\AppData\Local\Temp\2\b5944030-43d6-48fe-8749-d992894d57b6.ps1:2 char:11
    + Import-Csv <<<<  $savePath  | Group 'Имя звонящего','Дата звонка' -NoElement #| Out-File ($pathw+'counttab.txt')
        + CategoryInfo          : InvalidArgument: (:) [Import-Csv], PSArgumentException
        + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ImportCsvCommand

    _________________________________________

    Извините, что отнимаю ваше время.

    13 декабря 2016 г. 14:52
  • PS > Import-Csv 13122016.csv -Delimiter ";" |Group "Имя звонящего","Дата звонка" -NoElement
    WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missin
     headers.
    
    Count Name
    ----- ----
        1 380503322264, 01.12.20...
        2 103, 01.12.2016 0:00
        4 233, 01.12.2016 0:00
        2 110, 01.12.2016 0:00
        1 380675079994, 01.12.20...
        2 216, 01.12.2016 0:00
        1 240, 01.12.2016 0:00
        2 674401716, 01.12.2016 ...
        1 442777070, 01.12.2016 ...
        2 312, 01.12.2016 0:00
        1 459621202, 01.12.2016 ...
        2 102, 01.12.2016 0:00
        1 212, 01.12.2016 0:00
        5 504225422, 01.12.2016 ...
        2 202, 01.12.2016 0:00
        1 213, 01.12.2016 0:00
        2 107, 01.12.2016 0:00
        1 311, 01.12.2016 0:00
        1 302, 01.12.2016 0:00
        1 234, 01.12.2016 0:00
        1 203, 01.12.2016 0:00
        1 200, 01.12.2016 0:00

    13 декабря 2016 г. 15:41
    Отвечающий
  • Извините, не понимаю, что я делаю не так. (

    14 декабря 2016 г. 6:30
  • Скриншот из консоли PowerShell: Import-Csv $savePath


    • Изменено KazunEditor 14 декабря 2016 г. 6:42
    14 декабря 2016 г. 6:40
    Отвечающий


  • пересохранил в Юникоде:



    результат:


    • Изменено Tyuka 20 декабря 2016 г. 10:57
    14 декабря 2016 г. 7:01
  • Вы русский язык понимаете? Если нет, то пригласите у кого есть два класса образования.

    Запускать в PowerShell консоли, не в ISE, не в других редакторах. Файл должен быть в кодировке Unicode, если ума не хватает вставить правильный путь $savePath, то указать его вручную.

    14 декабря 2016 г. 7:15
    Отвечающий
  • Вы знаете, не могу назвать себя гением. Русский язык я прекрасно понимаю и достаточно не плохо знаю. Вставить правильный путь $savePath или указать его вручную - ума особо не надо. А вот от вашей манеры вести диалог, пропадает желание обращаться за помощью. Если я отнимаю Ваше время, то уж извините. Всегда разбирался сам, первый раз обратился за помощью, думал время сэкономить. А слушать, какой я говн*кодер, так это я и без Вас знаю. Это скриншот, который Вы просили? И да, от имени админ...., т.к. я понимаю, что Вы меня уже записали в касту аляушных. Или это опять не то? Хорошего дня.


    • Изменено Tyuka 14 декабря 2016 г. 7:44
    14 декабря 2016 г. 7:43
  • Ума не надо, но как видите выше, не смогли c 4 поста прошу. Я не прошу ничего лишнего, кроме правильно скопировать и вставить. Тут же я вижу ISE,блокноты, вранье, но не то что я просил:

    Пробовал заменять; на ,

    Пробовал сохранять в разных форматах Юникод, Ютф

    результат тот же (

    Теперь в консоли PowerShell:

     Import-Csv C:\poshdata\sAsterisk_14122016.csv -Delimiter ";" |Group "Имя звонящего","Дата звонка" -NoElement


    • Изменено KazunEditor 14 декабря 2016 г. 7:49
    14 декабря 2016 г. 7:48
    Отвечающий
  • Выложить файл этот на обменник и проверить результат работы на файле из Вашего поства - Вот сама csv  13122016.csv

    И версию PowerShell обозначить.

    Если PowerShell V2:

    Get-Content C:\poshdata\sAsterisk_14122016.csv | Foreach {$_ -replace ";;",";"} | ConvertFrom-Csv -Delimiter ";" |Group "Имя звонящего","Дата звонка" -NoElement

    • Изменено KazunEditor 14 декабря 2016 г. 8:08
    14 декабря 2016 г. 8:02
    Отвечающий
  • Спасибо,
    данная конструкция работает. Да пош 2.0
    Name             : ConsoleHostVersion          : 2.0

    Если можно еще один вопрос,
    мне необходимо считать только 3-х значные номера:

    Count Name                     
    ----- ----                     
        3 222, 06.12.2016 0:00     
        1 442425829, 06.12.2016 ...
        2 443627430, 06.12.2016 ...
        1 311, 06.12.2016 0:00     

    Я так понимаю, мне правильней удалить строки с "не нужными" номерами до подсчета?
    это лучше делать используя регулярные выражения?
    заранее спасибо. Вы мне очень помогли. Потому что я уже начал лепить костыли.

    14 декабря 2016 г. 10:57
  • $data = Get-Content C:\poshdata\sAsterisk_14122016.csv | Foreach {$_ -replace ";;",";"} | ConvertFrom-Csv -Delimiter ";" 
    $data | Where {$_."Имя звонящего".Trim() -match "^\d{3}$"} | Group "Имя звонящего","Дата звонка" -NoElement
    

    • Помечено в качестве ответа KazunEditor 19 декабря 2016 г. 5:49
    14 декабря 2016 г. 11:13
    Отвечающий