none
Wie kann man 2 Arrays in einer bestimmten Reihenfolge sortieren bzw. ausgeben? RRS feed

  • Frage

  • Hallo,

    evtl. gibt es dazu schon ein Thema, ich habe es aber leider nicht gefunden: Gibt es irgendeine Chance, diese beiden Arrays:

    $funktion = "Kopierer","Drucker","Fax","Senden/TX Gesamt","Faxübertragung","Scannersendung","Weitere Funktion(en)"
    $zaehler = "Gesamt","13235","Schwarzweiß","4459","Vollfarbe","80","Einfarbig","0","Zweifarbig","0","Schwarzweiß","5300","Vollfarbe","3378","Einfarbig","0","Zweifarbig","18","Schwarzweiß","0","Einfarbig","0","Schwarzweiß","438","Farbe","293","Gesamt","0","Schwarzweiß","438","Farbe","293","Duplex","1549"

    So zu sortieren:

    Gesamt
    13235

    Kopierer

    Schwarzweiß
    4459
    Vollfarbe
    80
    Einfarbig
    0
    Zweifarbig
    0

    Drucker

    Schwarzweiß
    5300
    Vollfarbe
    3378
    Einfarbig
    0
    Zweifarbig
    18

    Fax

    Schwarzweiß
    0
    Einfarbig
    0

    Senden/TX Gesamt

    Schwarzweiß
    438
    Farbe
    293

    Faxübertragung

    Gesamt
    0

    Scannersendung

    Schwarzweiß
    438
    Farbe
    293

    Weitere Funktion(en)

    Duplex
    1549

    Die Leerzeilen und der Fettdruck sollen nur deutlich machen, wo ich die Elemente des einen Arrays in das andere Array einfügen will.

    Über eine Lösung würde ich mich sehr freuen, da meine Versuche mit einer DO ... WHILE-Schleife mich leider nicht weiter gebracht haben:

    $list = @()
    $j=0
        for ($i=0; $i -lt $funktion.length; $i++){
            Do {
                if ($zaehler[$j] -match "[0-9*]"){$list += $zaehler[$j]} else {$list += $zaehler[$j]}
                $list += $funktion[$i]
                $j++
            } while ($zaehler[$j] -ne "Schwarzweiß" -AND $zaehler[$j] -ne "Gesamt" -AND $zaehler[$j] -ne "Duplex")
        } # for
    $list

    Viele Grüße

    Christian

    Mittwoch, 26. Juni 2013 14:22

Antworten

  • Daten aus einer HTML heraus zu Popeln ist sehr fehleranfällig und sollte immer nur Plan C sein!
    Da hilft nur eine feste Beziehung zuzuweisen. Am besten macht man das schon beim "Daten Popeln"

    Tabelle1 Feld 1 auslesen und dann Tabelle2 8 Felder lesen
    Tabelle1 Feld 2 auslesen und dann Tabelle2 8 Felder lesen
    usw..

    Ich habe es jetzt so mit einem Dreidimensionalen Hash gemacht.
    Man kann das auch über Berechnungen machen, dies bleibt aber immer eine feste Zuweisung da die Zahlen von Festen Indexen ausgehen müssen wie beim Schiffe versenken (Die Schiffe haben ja einen Festen Platz)!

    $funktion = "Kopierer","Drucker","Fax","Senden/TX Gesamt","Faxübertragung","Scannersendung","Weitere Funktion(en)"
    $Zaehler = "Gesamt","13235","Schwarzweiß","4459","Vollfarbe","80","Einfarbig","0","Zweifarbig","0","Schwarzweiß","5300","Vollfarbe","3378","Einfarbig","0","Zweifarbig","18","Schwarzweiß","0","Einfarbig","0","Schwarzweiß","438","Farbe","293","Gesamt","0","Schwarzweiß","438","Farbe","293","Duplex","1549"
    
    
    $DatenHash = @{}
    $DatenHash.Gesamt = @{$Zaehler[0] = $Zaehler[1]}
    
    ForEach($Entry in $Funktion) {
    
    	Switch($Entry) {
    		"Kopierer" {$DatenHash.Kopierer = @{
    						$Zaehler[2] = $Zaehler[3];
    						$Zaehler[4] = $Zaehler[5];
    						$Zaehler[6] = $Zaehler[7];						
    						$Zaehler[8] = $Zaehler[9];						
    						}
    					}
    		"Drucker" {$DatenHash.Drucker = @{
    						$Zaehler[10] = $Zaehler[11];
    						$Zaehler[12] = $Zaehler[13];
    						$Zaehler[14] = $Zaehler[15];						
    						$Zaehler[16] = $Zaehler[17];						
    						}
    					}
    		"Fax" {$DatenHash.Fax = @{
    						$Zaehler[18] = $Zaehler[19];
    						$Zaehler[20] = $Zaehler[21];						
    						}
    					}
    		"Senden/TX Gesamt" {$DatenHash.SendenTXGesamt = @{
    						$Zaehler[22] = $Zaehler[23];
    						$Zaehler[24] = $Zaehler[25];						
    						}
    					}
    		"Faxübertragung" {$DatenHash.Faxuebertragung = @{
    						$Zaehler[26] = $Zaehler[27];						
    						}
    					}
    		"Scannersendung" {$DatenHash.Scannersendung = @{
    						$Zaehler[28] = $Zaehler[29];
    						$Zaehler[30] = $Zaehler[31];						
    						}
    					}
    		"Weitere Funktion(en)" {$DatenHash.WeitereFunktionen = @{
    						$Zaehler[32] = $Zaehler[33];						
    						}
    					}
    	}
    }
    
    # Daten Auslesen
    ForEach ($FKeyValuePair in $DatenHash.GetEnumerator()){
    	"$($FKeyValuePair.Key)"
    	ForEach ($WKeyValuePair in ($FKeyValuePair.Value).GetEnumerator()){
    		"`t$($WKeyValuePair.Key) =  $($WKeyValuePair.Value)"
    	}
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 27. Juni 2013 06:08

Alle Antworten

  • Ich kann da weder einen logarithmus erkennen, noch irgendeinen anderen Weg die Daten miteiander zu Verknüpfen.
    Wo hast du denn die Daten her? In welchem Format kommen die den?

    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Mittwoch, 26. Juni 2013 16:34
  • Die Daten kommen von der Weboberfläche eines Druckers. Die Funktionen des Druckers sind aus der einen HTML-Tabelle als Text extrahiert, die Zählerstände aus einer anderen Tabelle.
    Mittwoch, 26. Juni 2013 17:01
  • Daten aus einer HTML heraus zu Popeln ist sehr fehleranfällig und sollte immer nur Plan C sein!
    Da hilft nur eine feste Beziehung zuzuweisen. Am besten macht man das schon beim "Daten Popeln"

    Tabelle1 Feld 1 auslesen und dann Tabelle2 8 Felder lesen
    Tabelle1 Feld 2 auslesen und dann Tabelle2 8 Felder lesen
    usw..

    Ich habe es jetzt so mit einem Dreidimensionalen Hash gemacht.
    Man kann das auch über Berechnungen machen, dies bleibt aber immer eine feste Zuweisung da die Zahlen von Festen Indexen ausgehen müssen wie beim Schiffe versenken (Die Schiffe haben ja einen Festen Platz)!

    $funktion = "Kopierer","Drucker","Fax","Senden/TX Gesamt","Faxübertragung","Scannersendung","Weitere Funktion(en)"
    $Zaehler = "Gesamt","13235","Schwarzweiß","4459","Vollfarbe","80","Einfarbig","0","Zweifarbig","0","Schwarzweiß","5300","Vollfarbe","3378","Einfarbig","0","Zweifarbig","18","Schwarzweiß","0","Einfarbig","0","Schwarzweiß","438","Farbe","293","Gesamt","0","Schwarzweiß","438","Farbe","293","Duplex","1549"
    
    
    $DatenHash = @{}
    $DatenHash.Gesamt = @{$Zaehler[0] = $Zaehler[1]}
    
    ForEach($Entry in $Funktion) {
    
    	Switch($Entry) {
    		"Kopierer" {$DatenHash.Kopierer = @{
    						$Zaehler[2] = $Zaehler[3];
    						$Zaehler[4] = $Zaehler[5];
    						$Zaehler[6] = $Zaehler[7];						
    						$Zaehler[8] = $Zaehler[9];						
    						}
    					}
    		"Drucker" {$DatenHash.Drucker = @{
    						$Zaehler[10] = $Zaehler[11];
    						$Zaehler[12] = $Zaehler[13];
    						$Zaehler[14] = $Zaehler[15];						
    						$Zaehler[16] = $Zaehler[17];						
    						}
    					}
    		"Fax" {$DatenHash.Fax = @{
    						$Zaehler[18] = $Zaehler[19];
    						$Zaehler[20] = $Zaehler[21];						
    						}
    					}
    		"Senden/TX Gesamt" {$DatenHash.SendenTXGesamt = @{
    						$Zaehler[22] = $Zaehler[23];
    						$Zaehler[24] = $Zaehler[25];						
    						}
    					}
    		"Faxübertragung" {$DatenHash.Faxuebertragung = @{
    						$Zaehler[26] = $Zaehler[27];						
    						}
    					}
    		"Scannersendung" {$DatenHash.Scannersendung = @{
    						$Zaehler[28] = $Zaehler[29];
    						$Zaehler[30] = $Zaehler[31];						
    						}
    					}
    		"Weitere Funktion(en)" {$DatenHash.WeitereFunktionen = @{
    						$Zaehler[32] = $Zaehler[33];						
    						}
    					}
    	}
    }
    
    # Daten Auslesen
    ForEach ($FKeyValuePair in $DatenHash.GetEnumerator()){
    	"$($FKeyValuePair.Key)"
    	ForEach ($WKeyValuePair in ($FKeyValuePair.Value).GetEnumerator()){
    		"`t$($WKeyValuePair.Key) =  $($WKeyValuePair.Value)"
    	}
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Donnerstag, 27. Juni 2013 06:08
  • Hallo Peter,

    erstmal vielen Dank für deinen Beitrag. Er war zwar nicht ganz die Lösung, hat mich aber auf eine Spur gebracht, die letztendlich zur Lösung geführt hat. :-)

    Leider funktioniert das Ganze nicht wie Schiffe versenken, da nicht alle Drucker Farbdrucker sind, bzw. eine FAX- oder Scan-Funktion haben. Daher habe ich deine statische Version in eine variable verwandelt:

    $funktion = "Kopierer","Drucker","Fax","Senden/TX Gesamt","Faxübertragung","Scannersendung","Weitere Funktion(en)"
    $zaehler = "Gesamt","13235","Schwarzweiß","4459","Vollfarbe","80","Einfarbig","0","Zweifarbig","0","Schwarzweiß","5300","Vollfarbe","3378","Einfarbig","0","Zweifarbig","18","Schwarzweiß","0","Einfarbig","0","Schwarzweiß","438","Farbe","293","Gesamt","0","Schwarzweiß","438","Farbe","293","Duplex","1549"
    # create array
    $list = @()
    $list += "Gesamt_" + $zaehler[0]
    $list += "Gesamt_" + $zaehler[1]
    $j=2
    for ($i=0; $i -lt $funktion.length-1; $i++){
        Do {
            # i use "$funktion[$i]" as key and concatenate it with "_" and the value in question
            if ($zaehler[$j] -match "[0-9*]"){$list += $zaehler[$i] + "_" + $zaehler[$j]} else {$list += $funktion[$i] + "_" + $zaehler[$j]}  
            $j++
        } while ($zaehler[$j] -ne "Schwarzweiß" -AND $zaehler[$j] -ne "Gesamt" -AND $zaehler[$j] -ne "Duplex")
    } # for
    # create hash table 
    $hash = @{}
    $k=0
    for ($i=0; $i -lt $list.length; $i++)
    {
        # for the 3 dimensional hash table i split the entries by key ($prtfunc) into key and value
        $prtfunc  = $list[$k].split("_")[0]
        $key      = $list[$k].split("_")[1]
        $value    = $list[$k+1].split("_")[1]
        # add every item to the hash table
        $hash.Item("$prtfunc") += @{
            $key = $value;
        }
        $k = $k + 2
    } # for
    # read data
    ForEach ($FKeyValuePair in $hash.GetEnumerator()){
    	"$($FKeyValuePair.Key)"
    	ForEach ($WKeyValuePair in ($FKeyValuePair.Value).GetEnumerator()){
    		"`t$($WKeyValuePair.Key) =  $($WKeyValuePair.Value)"
    	}
    }

    Wobei es noch ein Schönheitsfehler gibt: Das letzte Wertepaar "Duplex","1549" wird nicht berücksichtigt, da ich in der FOR-Schleife "$funktion.length-1" nehmen muss. Ohne das "-1" hinter "$funktion.length" geht die Schleife auf unendlich.

    for ($i=0; $i -lt $funktion.length-1; $i++){

    Vielen Dank nochmal für deine Hilfe,

    Christian

    Donnerstag, 27. Juni 2013 14:31