none
PowerShell Script - Daten auslesen und sortieren RRS feed

  • Frage

  • Hallo zusammen

    Ich habe eine kurze Frage. Ich lese aus einer CSV Datei mit Foreach und IF/Else 2 Spalten aus. Nun will ich die Ausgabe Filtern, weiss aber leider nicht wie ich dies realisieren kann. Die Spalten und Daten sehen so aus:

    Spalte 1 Spalte 2

    1 test

    1 test

    2 test

    1 test1

    1 test1

    1 test1

    2 test2

    3 test4

    1 test4

    3 test4

    Ich will nun nur die Zeilen ausgeben, bei denen in der Spalte 1 alle Werte gleich sind. Das heisst in diesem Beispiel würde nur Test1 und Test2 ausgegeben werden. Test und Test4 haben unterschiedliche Werte. Test1 und Test2 haben aber in der Spalte 1 immer die gleichen Werte.

    Kann mir jemand da einen Tipp geben wie ich solch ein Script mache? Mein Problem ist es die Werte der IF/Else Abfrage in Variablen zu Speichern. Wenn ich wüsste wie dies geht, könnte ich eine zweite IF/Else machen mit den Variablen, die diese Werte enthalten.

    Bin um jede Hilfe dankbar.

    Mittwoch, 13. Juni 2012 23:47

Antworten

  • Wieder mal ein schönes Beispiel dafür, das es die Sache deutlich einfacher macht, so viele Information wie möglich, sorgfältig anzugeben. :)

    Tu mir (und dir) bitte den Gefallen und lies dir diesen Post: Link mal genau durch.

     

    Nun kann man die Sache nämlich nochmal deutlich vereinfachen. Die Custom-Objekte können wir uns komplett sparen, das erledigt Import-CSV bereits für uns. So sieht das fertige Script jetzt aus:
     

    $allObj = @()
    
    $allobj = Import-Csv D:\my.csv |  Group-Object User
     
    foreach ($group in $allObj) {
    	if  ((($group.Group | Group-Object Status  | Measure-Object ).count -eq 1) -and ( ($group.group | Group-Object status).name -ne "offline") ) {
    		Write-host $group.name
    	}
    }
     

    Die zweite Abfrage habe ich noch um eine Bedingung erweitert, die auch Nutzer mit "gleichen Werten" (wie zuvor noch gefordert war) die aber ausschließlich aus "offline" bestehen, ausschließt.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".




    Donnerstag, 14. Juni 2012 13:08
    Moderator

Alle Antworten

  • Ich habe eine kurze Frage. Ich lese aus einer CSV Datei mit Foreach und IF/Else 2 Spalten aus. Nun will ich die Ausgabe Filtern, weiss aber leider nicht wie ich dies realisieren kann.

    Ich hoffe mal dass ich dein Anliegen nicht falsch interpretiert habe ... :)

    Wäre es da eventuell nicht einfacher das CSV File in eine Excel Datei umzuwandeln und anschliessend mit der Filter Funktion zu arbeiten? Gerade wenn du noch zusätzliche Filter anwenden möchtest, finde ich das eine bessere Lösung.

    (Leider nur ein Englisches Bild)


    Regards / Freundliche Grüsse King Julien


    Donnerstag, 14. Juni 2012 05:28
  • Du hast leider weder dein Script gepostet, noch geschrieben in welcher Form die aus der CSV extrahierten Daten jetzt vorliegen. Daher habe ich einfach mal ein Array mit den Daten angenommen.

    Diese werden kurzerhand in einzelne Objekte übertragen um damit vernünftig arbeiten zu können. Da du nicht erwähnt hast, welcher Natur die Daten sind, habe ich sie einfach mit String und Num benannt. Die neuen Objekte kommen in ein Array ($allobj).

    Die Idee ist folgende: Anstatt nun alle Werte mit jeweils allen anderen abzugleichen, gruppieren wir einfach alle Objekte nach ihren Namen (String). Damit sind schon mal alle zusammengehörigen Werte in einer Gruppe.

    Nun gruppieren wir die numerischen Werte innerhalb jeder Gruppe. Entsteht nur eine Gruppe (zb. "3"), sind die numerischen Werte alle gleich und der Name der Gruppe wird ausgegeben. Entsteht mehr als eine Gruppe gibt es unterschiedliche Werte und somit ist diese Gruppe uninteressant.
     

    $allObj = @()
    $csvdata = @("1 test","1 test","2 test","1 test1","1 test1","1 test1","2 test2","3 test4","1 test4","3 test4")
    
    # Daten in neue Custom-Objecte umwandeln
    foreach ($dat in $csvdata) {
    	$dat = $dat.split(" ")
    	$Object = New-Object Psobject -Property @{ 
    	   String = $dat[1]
    	   Num  = $dat[0]
    	}
    	# neue Objekte in Array speichern
    	$allObj += $Object	
    }
    
    # Objekte nach Strings groupieren
    $allObj = $allObj | Group-Object string
    
    # Gruppiere innerhalb jeder Gruppe die Nummern, wenn nur eine Gruppe ensteht > ausgabe
    foreach ($group in $allObj) {
    	if  ( ($group.Group | Group-Object Num | Measure-Object ).count -eq 1 ) {
    		Write-host $group.name
    	}
    }


    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Donnerstag, 14. Juni 2012 10:14
    Moderator
  • @Denniver

    Danke vielmals für die Mühe die du dir da gemacht hast. Werde das Script dann mal ausprobieren. Die Excelliste habe ich ein wenig falsch gepostet.

    Meine Excel sieht so aus:

    Status | User

    online | test

    online | test

    online | test1

    offline | test1

    offline | test3

    online | test4

    Dies wird als csv mit , getrennt in PowerShell eingelesen. Status und User sind die Headers der Tabelle.

    Nun soll mir Excel oder PowerShell einfach ausgeben bei welchem User alle PCs Online sind. Dies wäre ja dann test und test4. Wenn bei einem User nur ein PC offline ist, soll er diesen user nicht ausgeben.

    Hier noch mein PowerShell Script was ich bereits hatte.

    $excel = Import-Csv D:\test.csv

    foreach-object{

    if($excel.status -eq "online"){Status und Benutzer ausgeben und Grün färben}

    else{Status und Benutzer ausgeben und Rot färben}

    }

    So konnte ich halt einfach mal sehen welcher PC von welchem Benutzer Online und Offline ist. Nun wollte ich halt dieses Script so erweitern das es mir nur die Benutzer anzeigt, bei denen alle PCs Online sind. Sobald nur ein PCs vom Benutzer Offline ist, soll er diesen Benutzer nicht anzeigen.

    @King Julien

    Wäre natürlich auch offen über eine Lösung mit Excel. Habe es versucht aber leider auch nicht hinbekommen. Kenne mich mit Excel auch nicht so gut aus und da gibt es ja recht viele Funktionen die man nehmen kann. Bin auf die Funktion Countif gestossen, dieser macht mir halt dann das gleiche wie ich in meinem PowerShell Script schon erreicht habe. Wenn du alles zufällig gerade weisst welche Funktion ich da benutzen muss, würde ich es auch in Excel umsetzen.

    Gruss

    Benjamin

    Donnerstag, 14. Juni 2012 11:00
  • Wieder mal ein schönes Beispiel dafür, das es die Sache deutlich einfacher macht, so viele Information wie möglich, sorgfältig anzugeben. :)

    Tu mir (und dir) bitte den Gefallen und lies dir diesen Post: Link mal genau durch.

     

    Nun kann man die Sache nämlich nochmal deutlich vereinfachen. Die Custom-Objekte können wir uns komplett sparen, das erledigt Import-CSV bereits für uns. So sieht das fertige Script jetzt aus:
     

    $allObj = @()
    
    $allobj = Import-Csv D:\my.csv |  Group-Object User
     
    foreach ($group in $allObj) {
    	if  ((($group.Group | Group-Object Status  | Measure-Object ).count -eq 1) -and ( ($group.group | Group-Object status).name -ne "offline") ) {
    		Write-host $group.name
    	}
    }
     

    Die zweite Abfrage habe ich noch um eine Bedingung erweitert, die auch Nutzer mit "gleichen Werten" (wie zuvor noch gefordert war) die aber ausschließlich aus "offline" bestehen, ausschließt.

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".




    Donnerstag, 14. Juni 2012 13:08
    Moderator
  • wow, danke sehr für die schnelle Hilfe. Werde den Link auch gleich noch durchlesen wegen dem Posten.

    Gruss

    Benjamin

    Donnerstag, 14. Juni 2012 16:34
  • Kann man den Script auch für mein Bsp. benutzen. Habe auch zwei Bilder gemacht.

    Wenn es gehen sollte könnte man mir sagen was ich genau ändern muss.

    VORHER

    NACHHER

    danke für die zeit

    Donnerstag, 18. August 2016 09:10