Tipps

Eine Zahlenreihe in zwei alternierende (wechselnde) Gruppen aufteilen mit Powershell

Stellen Sie sich vor, Sie haben eine aufsteigende Reihe natürlicher (ganzer) Zahlen. Sie wollen die Zahlenreihe in 2 Blöcke aufteilen, die nach einer bestimmten Menge von Zahlen jeweils wechselt. Dazu ein Beispiel:

Gruppe 1 Gruppe 2
1-500 501-1000
1001-1500  1501-2000
2001-2500 2501-3000

 

 

 

 

Das kann z.B. interessant sein, wenn Sie eine If-Abfrage definieren möchten, die nur zwei Ausgänge hat, die aber für aufeinanderfolgende Zahlenblöcke abwechselnd auftreten.

Um diese Ergebnis zu erreichen, schauen Sie sich zuerst die Abstände zwischen den Gruppen an. Jeder Gruppe besteht aus jeweils 500 natürlichen Zahlen. Daher teilen Sie eine gegebene Zahl zuerst durch 500. Möchten Sie z.B. die Zahl 1789 in eine Gruppe einsortieren, rechnen Sie 1798/500. Das Ergebnis ist 3,578. Ignorieren Sie den Nachkommateil, denn der interessiert uns nicht. Durch das Teilen mit 500 haben immer 500 aufeinanderfolgende Zahlen die gleiche Vorkommastelle. Jetzt haben wir aber immer noch eine unendliche große Gruppe von Zahlen von jeweils 500. Um die Gruppen in lediglich zwei Gruppen aufzuteilen, teilen wir das Endergebnis durch 2 und schauen und jetzt nur den Rest an, der bei der Division übrig bleibt.

3 / 2 = 1,5 > Rest 5.

Wenn wir durch 2 teilen, kann es tatsächlich immer nur zum Rest 5 oder zu gar keinem Rest kommen, je nachdem, ob die Stelle vor dem Komma gerade oder ungerade ist. Damit haben wir genau zwei Gruppen geschaffen, nämlich die Zahlen, bei denen beim Teilen der ganzzahligen Anteils nach der Divison durch 500 ein gerades Ergebnis herauskommt, und die Zahlen, bei denen ein ungerades Ergebnis herauskommt.

Um den ganzzahlen Anteil einer Zahl programmatisch zu berechnen, stellt und das .Net-Framework in der Klasse [math] die Methode Floor() zur Verfügung. Den Rest einer Division wird auch als Modulo oder Mod bezeichnet. Der mathematische Operator in Powershell ist das %-Zeichen. Hier die beiden Berechnungen:

$Ganzzahl: [math]::floor(1798) # Gibt den ganzzahlen Anteil der Zahl zurück, ohne zu runden
$Ganzzahl % 2 # Gibt den  Rest einer Division zurück, bei geraden Zahlen also Null, bei ungeraden Zahlen 5

Wenn man diese Berechnungen für eine große Zahl von Zahlen durchführen muß, baut man sich am Besten eine Funktion. Wenn Sie nicht bei 0 anfangen wollen zu zählen, sondern bei 1, subtrahiern Sie eins von allen zu testenden Zahlen:

function test-number
{
param
(
  [int]$number
)
  ([math]::floor((($number-1) / 500))) % 2
}

Die Funktion gibt für Zahlen im unteren 500er-Block 0 zurück, für Zahlen im oberen 500er-Block 1.

Um die nächstgrößere Ganzzahl auszugeben, verwenden Sie übrigens den Funktion [math]::Ceiling(<Double>).

 


 125,    11  Jan  2019 ,   Tipp
Holger Voges

  E-Mail Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Holger Voges ist Inhaber der Firma Netz-Weise IT-Training und seit 1999 als Trainer und Consultant tätig. Als Allrounder in den Bereichen Windows Server, Active Directory, SQL Server, Hyper-V und Windows PowerShell, hat er in der Vergangenheit zahlreiche Einsätze als Consultant in namenhaften Firmen absolviert und so neben der Theorie auch umfangreiche praktische Erfahrungen gesammelt.

 

Netz-Weise

Das Haupt-Tätigkeitsfeld von Netz-Weise sind Schulungen für Profis. Bei uns bekommen Sie das Programm für den fortgeschrittenen Praktiker, der die Tiefen des Systems ausloten möchte genauso wie Standard-Schulungen.

So erreichen Sie uns:

Netz-Weise
IT-Training und Beratung
Freundallee 13a
30173 Hannover
 
Tel: (0511) 165 925-0
Fax: (0511) 165 925-99
email: info(at)netz-weise.de
 

Newsletter bestellen

Das Wichtigste kompakt ins E-Mailfach!