Powershell - 2 Arrays vergleichen und gleiche Einträge verbinden
Im ersten Array wird eine HL7 Datei eingelesen
im zweiten Array wird die .ini-Datei eingelesen
Es sollen nun beide Arrays verglichen und zusammengebaut werden.
Dazu gibt es ja "Compare-Object $array1 $array2". OK.
Aber wie kann ich in einem Array3 Werte zusammensetzen?
Was heißt das im Klartext?
Im Array 2 werden die wichtigen Positionen eingetragen.
Im Array 1 stehen aber die Werte drin.
Das Array 1 wird ja durch eine HL7 Datei gefüllt.
Im Array 1 steht dann z.B. "MSH_Position_3=WERT1"
Das Array 2 wird durch die .ini-Datei befüllt.
Im Array 2 steht dann z.B. "MSH_Position_3="
Es muss nun also ein Array 3 erzeugt werden, dass letztlich jeweils den Wert von Array 1 an den Key von Array 2 anhängt. Das hat den Grund, dass die HL7-Datei viele andere Einträge enthält, die ggf. nicht wichtig sind, also nicht ausgegeben werden sollen. Darum werden mit der .ini-Datei nur die Reihenfolge der wichtigen Daten und die relevanten Daten vorgegeben.
Wie kann ich also dem Array 3 sagen "Schaue was im Array 2 vorhanden ist, sollte im Array 1 derselbe Key enthalten sein, so füge den Value aus Array 1 an den Key von Array 2 an"
Das Array 3 sollte dann so aussehen:
MSH_Position_3=WERT1
...
..
usw.
im zweiten Array wird die .ini-Datei eingelesen
Es sollen nun beide Arrays verglichen und zusammengebaut werden.
Dazu gibt es ja "Compare-Object $array1 $array2". OK.
Aber wie kann ich in einem Array3 Werte zusammensetzen?
Was heißt das im Klartext?
Im Array 2 werden die wichtigen Positionen eingetragen.
Im Array 1 stehen aber die Werte drin.
Das Array 1 wird ja durch eine HL7 Datei gefüllt.
Im Array 1 steht dann z.B. "MSH_Position_3=WERT1"
Das Array 2 wird durch die .ini-Datei befüllt.
Im Array 2 steht dann z.B. "MSH_Position_3="
Es muss nun also ein Array 3 erzeugt werden, dass letztlich jeweils den Wert von Array 1 an den Key von Array 2 anhängt. Das hat den Grund, dass die HL7-Datei viele andere Einträge enthält, die ggf. nicht wichtig sind, also nicht ausgegeben werden sollen. Darum werden mit der .ini-Datei nur die Reihenfolge der wichtigen Daten und die relevanten Daten vorgegeben.
Wie kann ich also dem Array 3 sagen "Schaue was im Array 2 vorhanden ist, sollte im Array 1 derselbe Key enthalten sein, so füge den Value aus Array 1 an den Key von Array 2 an"
Das Array 3 sollte dann so aussehen:
MSH_Position_3=WERT1
...
..
usw.
if ($Array1 -contains $Array2)
{ $Array3 = @();
$Array3 += $Array1;
Write-Host "Eintrag hinzugefügt " $Array3
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 329028
Url: https://administrator.de/contentid/329028
Ausgedruckt am: 25.11.2024 um 09:11 Uhr
6 Kommentare
Neuester Kommentar
Hi,
ich würde Array3 weglassen. Statt dessen direkt in Array2 ändern.
Array2 jetzt wieder als INI speichern.
E.
ich würde Array3 weglassen. Statt dessen direkt in Array2 ändern.
Für jedes Element in Array2
endet es mit einem "="?
wenn ja, gibt es in Array1 ein Element, welches mit dem aktuellen Element von Array2 beginnt?
wenn ja, fein. Array2-Element = Array1-Element
nächstes Array2-Element
Array2 jetzt wieder als INI speichern.
E.
Reden wir hier von zwei Dictionaries mit deren Membern KEY und VALUE oder zwei reinen STRING-ARRAYS??
Denn das was du im letzten Thread hattest sind Dictionary Objekte und die sind ganz anders zu handhaben!
Hier ein Beispiel wenn es zwei Dictionaries sind
Das gibt alle Keys und zugehörige Werte aus deren Keys in beiden Dictionaries übereinstimmen. Das erste Objekt (ReferenceObject) muss das Dictionary sein welches die Werte enthält.
Bei reinen String-Arrays ohne Eigenschaften kannst du das mit einem einfachen where-object abfackeln in dem du das andere und das gerade befindlichen Objekt in der Pipeline am Gleichheitszeichen splittest und mit dem Operator -IN vergleichst dann werden aus dem ersten Array alle Werte ausgeben die im zweiten vorhanden sind.
Denn das was du im letzten Thread hattest sind Dictionary Objekte und die sind ganz anders zu handhaben!
Hier ein Beispiel wenn es zwei Dictionaries sind
$result = compare $dict1 $dict2 -Property Key -IncludeEqual -ExcludeDifferent -Passthru
Bei reinen String-Arrays ohne Eigenschaften kannst du das mit einem einfachen where-object abfackeln in dem du das andere und das gerade befindlichen Objekt in der Pipeline am Gleichheitszeichen splittest und mit dem Operator -IN vergleichst dann werden aus dem ersten Array alle Werte ausgeben die im zweiten vorhanden sind.
$result = $array1 | ?{$_.Split('=') -in ($array2 | %{$_.Split('=')})}
Jedoch übernimmt er nicht die Reihenfolge, die im Array 2 vorgeben ist. Was ich gerade nicht verstehe.
Normal weil bei obigem Code das Array1 (das mit den Werten) gefiltert wird und nicht das Zweite ;-PDu musst das ganze nur umdrehen > Hausaufgabe lieber Azubi
Falls der Groschen noch immer nicht gefallen ist, pittöö ein Beispiel
$array1 = "MSH_Position_5=Wert1","MSH_Position_7=Wert2","MSH_Position_1=Wert3","MSH_Position_2=Wert4"
$array2 = "MSH_Position_1=","MSH_Position_2="
$array2 | %{$itm=$_; $array1 | ?{$itm.split('=') -eq $_.split('=')}}