Извлечение данных из файла и сортировка их в новом файле с PowerShell - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю над сценарием, который должен дать мне время на запрос идентификатора Invoke. Короткие строки содержат идентификатор Invoke. В длинных строках я получаю сообщение с сервера.

Мне нужно структурировать файл, получив идентификатор, ApplicationGatewayID и разницу во времени между отправкой и получением.

Мой план состоял в том, чтобы получить запрос и ответ в одну строку, хотя файл отсортирован по invokeID, шаблон не повторяется. Кроме того, есть несколько идентификаторов, у которых есть только ответ и нет запроса, который усложняет задачу.

11:20:36:645 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:645 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:645 ra-agi Trace:     InvokeID =             11359017 
11:20:36:645 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:645 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:645 ra-agi Trace:     InvokeID =             11359018 
11:20:36:739 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:739 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:739 ra-agi Trace:     InvokeID =             11359026 
11:20:36:723 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:723 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:723 ra-agi Trace:     InvokeID =             11359027 
11:20:36:739 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:739 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:739 ra-agi Trace:     InvokeID =             11359028 
11:20:36:739 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:739 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:739 ra-agi Trace:     InvokeID =             11359029 
11:20:36:848 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:848 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:848 ra-agi Trace:     InvokeID =             11359031 
11:20:36:645 11359032
11:20:36:645 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:645 ra-agi Trace:     ApplicationGatewayID = 5000  11:20:36:645 ra-agi Trace:     InvokeID =             11359032 
11:20:36:645 11359033
11:20:36:676 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:676 ra-agi Trace:     ApplicationGatewayID = 5000  11:20:36:676 ra-agi Trace:     InvokeID =             11359033 
11:20:36:848 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:848 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:848 ra-agi Trace:     InvokeID =             11359034 
11:20:36:645 11359034
11:20:36:676 11359035
11:20:36:848 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:848 ra-agi Trace:     ApplicationGatewayID = 5001  11:20:36:848 ra-agi Trace:     InvokeID =             11359035 
11:20:36:739 ra-agi Trace: Received Query Confirm message from application gateway host.  11:20:36:739 ra-agi Trace:     ApplicationGatewayID = 5000  11:20:36:739 ra-agi Trace:     InvokeID =             11359036 
11:20:36:739 11359036
11:20:36:739 11359037

Конечный продукт должен выглядеть следующим образом: первый столбец InvokeID, второй столбец ApplicationGatewayID, третий столбец: время между отправкой и получения

11359017    5001    127
11359018    5000    114
11359019    5001    105

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Просматривая ваш последний комментарий, и если я правильно понимаю вопрос, он должен это сделать:

$result = (Get-Content -Path 'X:\TheInputFile.txt').Trim() | Where-Object { $_.Length -gt 8 } |
    Group-Object @{Expression = {$_.Substring($_.Length - 8)}} |  # group by InvokeID (last 8 characters of the trimmed line)
    Where-Object {$_.Count -eq 2 } |                              # select only groups with two items in it (one long and one short line)
    ForEach-Object {
        $invokeID  = $_.Name
        $millisOne = $millisTwo = 0   # two variables to store the parsed milliseconds from the time stamps
        foreach ($line in $_.Group) {
            $timeToParse = $line.Substring(0,12) -replace ':(\d{3}$)', '.$1' # replace the last colon ':' into a dot '.' for parsing
            if ($line -match 'ApplicationGatewayID\s+=\s+(\d+)') {           # if this is the long line..
                $gatewayID = $Matches[1]
                $millisOne = [TimeSpan]::Parse($timeToParse).TotalMilliSeconds
            }
            else {
                $millisTwo = [TimeSpan]::Parse($timeToParse).TotalMilliSeconds
            }
        }
        # output an object with the properties you need
        [PsCustomObject]@{
            'InvokeID'             = $invokeID
            'ApplicationGatewayID' = $gatewayID
            'ProcessTime'          = [Math]::Abs($millisOne - $millisTwo)
        }
    }

# output the result on screen
$result

# write the resukt to a new CSV file
$result | Export-Csv -Path 'X:\TheOutputFile.csv' -NoTypeInformation

Используя ваш пример входного файла, вы получите такой результат:

InvokeID ApplicationGatewayID ProcessTime
-------- -------------------- -----------
11359032 5000                           0
11359033 5000                          31
11359034 5001                         203
11359035 5001                         172
11359036 5000                           0
0 голосов
/ 05 февраля 2020

Это должно работать:

Get-Content 'D:\myfile.txt' | ? { $_ -like '*InvokeID*' } | ForEach-Object { 

    $a = @($_ -split ' +')
    $d = New-TimeSpan -Start ([System.DateTime](($a[0]).Substring(0,8))) -End ([System.DateTime](($a[11]).Substring(0,8)))
    "$($a[22]) $($a[16]) $d" 

   } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...