none
In CSV Werte finden und andere Werte vergleichen RRS feed

  • Frage

  • Hallo Leute,

    neu hier und hoffe ich bin richtig...

    Muss aus einem CSV-Logfile, Zeilen mit bestimmten Werten in einem bestimmten Feld finden. Wert1 steht für Verbindung hergestellt und Wert2 steht für Verbindung wieder getrennt. Dann müsste ich die Differenz der Zeit-Felder dieser Zeilen ausgeben um die Dauer dieser Verbindung auszugeben. Ich hoffe ich habe mich verständlich ausgedrückt... Hat irgend jemand einen Ansatz oder eine Idee wie ich das am einfachsten lösen kann?

    Vielen Dank im Voraus

    LG Oliva

    Montag, 14. Januar 2019 14:02

Antworten

  • OK, 's is nich elegant, aber vielleicht kansnt Du ja was davon verwenden ...

    $CSVRaw = @'
    "Date","Time","ReportingHost","ReportingHostIPAddress","EventID"
    "10/19/2015","09:17:40","VM01","192.168.0.123","111"
    "10/19/2015","09:19:42","VM01","192.168.0.123","112"
    "10/19/2015","09:17:11","VM01","192.168.0.123","110"
    '@
    
    $CSV = ConvertFrom-Csv -InputObject $CSVRaw -Delimiter ',' |
        Select-Object -Property ReportingHost,
            @{Name='ReportingHostIPAddress';Expression={[IPAddress]$_.ReportingHostIPAddress}},
            @{Name='EventID';Expression={[INT]$_.EventID}},
            @{Name='DateTime';Expression={[DateTime]::ParseExact( $_.Date +' ' + $_.Time,'MM/dd/yyyy HH:mm:ss',$null)}}| 
                Sort-Object -Property ReportingHost,EventID
    
    $Index = 0
    $Result = foreach($Element in $CSV){
        [PSCustomObject]@{
            ReportingHost = $Element.ReportingHost
            ReportingHostIPAddress = $Element.ReportingHostIPAddress
            EventID = $Element.EventID
            DateTime = $Element.DateTime
            Duration = if($Index -eq 0){$null}Else{New-TimeSpan -Start $CSV[$Index - 1].DateTime -End $Element.DateTime}
        }
        $Index++
    } 
    $Result |
        Format-Table -AutoSize
    Die Elemente werden nach EventID sortiert und es wird nicht geprüft, ob die IDs aufeinanderfolgend sind. Wenn das nötig ist, musst Du das noch einbauen.

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''




    Montag, 14. Januar 2019 23:09
  • Moin,

    so, ich habe jetzt die nicht-elegante Lösung auch mal implementiert. Hier die Quelldaten:

    "Date","Time","ReportingHost","ReportingHostIPAddress","EventID"
    "10/19/2015","09:17:40","VM01","192.168.0.123","111"
    "10/19/2015","09:18:01","VM02","192.168.0.124","111"
    "10/19/2015","09:18:55","VM02","192.168.0.124","112"
    "10/19/2015","09:19:42","VM01","192.168.0.123","112"
    "10/19/2015","09:17:11","VM01","192.168.0.123","110"
    "10/19/2015","09:25:22","VM02","192.168.0.124","110"
    "10/20/2015","11:20:40","VM02","192.168.0.124","111"
    "10/20/2015","11:45:06","VM02","192.168.0.124","112"
    "10/20/2015","12:01:21","VM02","192.168.0.124","110"
    "10/20/2015","14:53:40","VM01","192.168.0.123","111"
    "10/20/2015","15:01:06","VM01","192.168.0.123","112"
    "10/20/2015","15:17:11","VM01","192.168.0.123","110"

    und das Skript dazu:

    $data = Import-CSV C:\TEMP\log.txt | Select-Object -Property ReportingHost,
            @{Name='ReportingHostIPAddress';Expression={[IPAddress]$_.ReportingHostIPAddress}},
            @{Name='EventID';Expression={[INT]$_.EventID}},
            @{Name='DateTime';Expression={[DateTime]::ParseExact( $_.Date +' ' + $_.Time,'MM/dd/yyyy HH:mm:ss',$null)}} | Sort DateTime
    for ($i=0;$i -lt $data.Count;$i++) {
        if ($data[$i].EventID -eq 111) {
            $found = $false
            $j = $i + 1
            do {
                if (($data[$j].ReportingHost -eq $data[$i].ReportingHost) -and ($data[$j].EventId -eq 112)) {
                    $found = $true
                    [PSCustomObject]@{
                        ReportingHost = $data[$i].ReportingHost
                        ReportingHostIPAddress = $data[$i].ReportingHostIPAddress
                        StartTime = $data[$i].DateTime
                        Duration = New-TimeSpan -Start ($data[$i].DateTime) -End ($data[$j].DateTime)
                    }
                } else {
                    $j++
                }
            } until ($found -or ($j -eq $data.Count -1))
            if (!$found) { Write-Warning "End missing: $($data[$i].ReportingHost)" }
        }
    }


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 15. Januar 2019 10:40

Alle Antworten

  • Moin,

    mit Import-CSV importieren, die Werte in [datetime] wandeln und eine Differenz bilden. Ansonsten wäre Dein Anliegen sicherlich klarer, wenn Du einen Ausschnitt aus der Datei posten könntest ;-)


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert ContrOliva Montag, 14. Januar 2019 15:08
    • Tag als Antwort aufgehoben ContrOliva Montag, 14. Januar 2019 15:08
    Montag, 14. Januar 2019 14:26
  • Vielen Dank für die schnelle Hilfe...

    CSV sieht folgendermassen aus:

    "Date","Time","ReportingHost","ReportingHostIPAddress","EventID"
    "10/19/2015","09:17:11","VM01","192.168.0.123","110"
    "10/19/2015","09:17:40","VM01","192.168.0.123","111"
    "10/19/2015","09:19:42","VM01","192.168.0.123","112"

    Importieren ist mir schon klar, ich möchte jeweils fortlaufend die Zeit-Differenz von Zeile mit der "EventID" "111" also "09:17:40" mit der darauf folgenden Zeile mit der "EventID" "112" also "09:19:42" ausgeben. In diesem Fall zB 00:02:02.

    Montag, 14. Januar 2019 14:50
  • ...die Herausforderung liegt aber darin, dass die „darauffolgende 112-Zeile“ nicht notwendigerweise die nächste ist, richtig?

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Montag, 14. Januar 2019 15:23
  • Hallo Evgenij,

    ganz genau! Sorry, vergaß ich zu erwähnen...Hast du evtl eine Idee?

    GO

    Montag, 14. Januar 2019 18:48
  • Klar, die primitivste Lösung wären zwei verschachtelte for-Schleifen, ich überlege gerade, wie es eleganter geht...

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Montag, 14. Januar 2019 19:17
  • Muß ja gar nicht elegant sein, traue es mir ja gar nicht sagen, nur da ich ein relativer Neuling bin was PS angeht habe ich keine Idee dazu und was hier alles möglich ist und bin somit für jeden Rat dankbar :)
    Montag, 14. Januar 2019 19:44
  • OK, 's is nich elegant, aber vielleicht kansnt Du ja was davon verwenden ...

    $CSVRaw = @'
    "Date","Time","ReportingHost","ReportingHostIPAddress","EventID"
    "10/19/2015","09:17:40","VM01","192.168.0.123","111"
    "10/19/2015","09:19:42","VM01","192.168.0.123","112"
    "10/19/2015","09:17:11","VM01","192.168.0.123","110"
    '@
    
    $CSV = ConvertFrom-Csv -InputObject $CSVRaw -Delimiter ',' |
        Select-Object -Property ReportingHost,
            @{Name='ReportingHostIPAddress';Expression={[IPAddress]$_.ReportingHostIPAddress}},
            @{Name='EventID';Expression={[INT]$_.EventID}},
            @{Name='DateTime';Expression={[DateTime]::ParseExact( $_.Date +' ' + $_.Time,'MM/dd/yyyy HH:mm:ss',$null)}}| 
                Sort-Object -Property ReportingHost,EventID
    
    $Index = 0
    $Result = foreach($Element in $CSV){
        [PSCustomObject]@{
            ReportingHost = $Element.ReportingHost
            ReportingHostIPAddress = $Element.ReportingHostIPAddress
            EventID = $Element.EventID
            DateTime = $Element.DateTime
            Duration = if($Index -eq 0){$null}Else{New-TimeSpan -Start $CSV[$Index - 1].DateTime -End $Element.DateTime}
        }
        $Index++
    } 
    $Result |
        Format-Table -AutoSize
    Die Elemente werden nach EventID sortiert und es wird nicht geprüft, ob die IDs aufeinanderfolgend sind. Wenn das nötig ist, musst Du das noch einbauen.

    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''




    Montag, 14. Januar 2019 23:09
  • Hey vielen Dank, sieht mal gut aus, ich werde es gleich heute bei Gelegenheit probieren und dir Rückmelden wie es gelaufen ist...

    LG Oliva

    Dienstag, 15. Januar 2019 08:26
  • Moin, ich würde aber die Sortierung erst nach Host und dann nach EventID vornehmen, falls tatsächlich mehrere Quellen in dieselbe Datei schreiben.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.


    Dienstag, 15. Januar 2019 08:48
  • Moin, ich würde aber die Sortierung erst nach Host und dann nach EventID vornehmen, falls tatsächlich mehrere Quellen in dieselbe Datei schreiben.

    Dein Wunsch ist mir Befehl!   ;-)  :-D   ....  ist angepasst.

    Für diesen Ansatz muss man schon von ein paar Voraussetzungen ausgehen, die erfüllt sein müssen, damit es wie gewünscht funktioniert.  .... aber wem erzähl ich das?  :-D


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 15. Januar 2019 09:04
  • Moin, ich würde aber die Sortierung erst nach Host und dann nach EventID vornehmen, falls tatsächlich mehrere Quellen in dieselbe Datei schreiben.

    Dein Wunsch ist mir Befehl!   ;-)  :-D   ....  ist angepasst.

    Für diesen Ansatz muss man schon von ein paar Voraussetzungen ausgehen, die erfüllt sein müssen, damit es wie gewünscht funktioniert.  .... aber wem erzähl ich das?  :-D


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Hmmmm. Und eigentlich wird es auch dann nicht korrekt funktionieren, wenn mehrere Einträge von ein und demselben Host drin sind. Ich glaub, an der doppelten for-Schleife kommen wir da nicht vorbei...


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 15. Januar 2019 09:14
  • Naja, so richtig schlüssig scheinen die CSV-Daten ja sowieso nicht zu sein .... oder mir fehlen noch Informationen. ;-)  ... aber vielleicht kann Oliva ja ein paar Schnipsel vom Code gebrauchen.

    Ist Oliva eigentlich ein Jungsname oder ein Mädchenname? ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 15. Januar 2019 10:11
  • Moin,

    so, ich habe jetzt die nicht-elegante Lösung auch mal implementiert. Hier die Quelldaten:

    "Date","Time","ReportingHost","ReportingHostIPAddress","EventID"
    "10/19/2015","09:17:40","VM01","192.168.0.123","111"
    "10/19/2015","09:18:01","VM02","192.168.0.124","111"
    "10/19/2015","09:18:55","VM02","192.168.0.124","112"
    "10/19/2015","09:19:42","VM01","192.168.0.123","112"
    "10/19/2015","09:17:11","VM01","192.168.0.123","110"
    "10/19/2015","09:25:22","VM02","192.168.0.124","110"
    "10/20/2015","11:20:40","VM02","192.168.0.124","111"
    "10/20/2015","11:45:06","VM02","192.168.0.124","112"
    "10/20/2015","12:01:21","VM02","192.168.0.124","110"
    "10/20/2015","14:53:40","VM01","192.168.0.123","111"
    "10/20/2015","15:01:06","VM01","192.168.0.123","112"
    "10/20/2015","15:17:11","VM01","192.168.0.123","110"

    und das Skript dazu:

    $data = Import-CSV C:\TEMP\log.txt | Select-Object -Property ReportingHost,
            @{Name='ReportingHostIPAddress';Expression={[IPAddress]$_.ReportingHostIPAddress}},
            @{Name='EventID';Expression={[INT]$_.EventID}},
            @{Name='DateTime';Expression={[DateTime]::ParseExact( $_.Date +' ' + $_.Time,'MM/dd/yyyy HH:mm:ss',$null)}} | Sort DateTime
    for ($i=0;$i -lt $data.Count;$i++) {
        if ($data[$i].EventID -eq 111) {
            $found = $false
            $j = $i + 1
            do {
                if (($data[$j].ReportingHost -eq $data[$i].ReportingHost) -and ($data[$j].EventId -eq 112)) {
                    $found = $true
                    [PSCustomObject]@{
                        ReportingHost = $data[$i].ReportingHost
                        ReportingHostIPAddress = $data[$i].ReportingHostIPAddress
                        StartTime = $data[$i].DateTime
                        Duration = New-TimeSpan -Start ($data[$i].DateTime) -End ($data[$j].DateTime)
                    }
                } else {
                    $j++
                }
            } until ($found -or ($j -eq $data.Count -1))
            if (!$found) { Write-Warning "End missing: $($data[$i].ReportingHost)" }
        }
    }


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 15. Januar 2019 10:40
  • Ah ... ok ... siehste ... ich hatte ein paar falsche Annahmen im Kopf  ...

    Cool ... na ma kukn, was Oliva meint. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Dienstag, 15. Januar 2019 10:51
  • Hallo zusammen, sorry ich war die letzten 2 Wochen verhindert und konnte nicht Antworten. Ich danke vielmals für die Tips, Ihr habt mir sehr weitergeholfen... Sobald ich etwas davon umgesetzt habe, werde ich Euch das Skript posten!
    Freitag, 1. Februar 2019 07:49