internet2107
Goto Top

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.

if ($Array1 -contains $Array2) 
	{ $Array3 = @();
		$Array3 += $Array1;
		Write-Host "Eintrag hinzugefügt " $Array3  
	}

Content-ID: 329028

Url: https://administrator.de/contentid/329028

Ausgedruckt am: 25.11.2024 um 09:11 Uhr

emeriks
emeriks 10.02.2017 aktualisiert um 08:57:12 Uhr
Goto Top
Hi,
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.
132272
Lösung 132272 10.02.2017 aktualisiert um 09:50:53 Uhr
Goto Top
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
$result = compare $dict1 $dict2 -Property Key -IncludeEqual -ExcludeDifferent -Passthru
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.
$result = $array1 | ?{$_.Split('=') -in ($array2 | %{$_.Split('=')})}  
internet2107
internet2107 10.02.2017 um 11:08:28 Uhr
Goto Top
Beiden vielen Dank für die Antworten.

@papier:
Der zweite Code (String-Array) macht das was er soll. ABER!, leider noch mit dem Problem, dass die Reihenfolge nicht eingehalten wird.
Die Lösung
$result = $array1 | ?{$_.Split('=') -in ($array2 | %{$_.Split('=')})}  
nimmt alles raus, was nicht wichtig ist. Das ist schon mal ein großer Schritt.
Jedoch übernimmt er nicht die Reihenfolge, die im Array 2 vorgeben ist. Was ich gerade nicht verstehe.

Beispiel:
Ausgabe Array 2 (Write-host):
MSH_Position_4= MSH_Position_6= MSH_Position_7= PID_Position_6= PID_Position_3= PID_Position_5= PV1_Position_19= PV1_Position_3=

Nachdem das Script durchgelaufen ist, kommt raus:
PID Ausgabe (Write-host):
PID_Position_3=0080012103 PID_Position_5=WERT1 PID_Position_6= WERT2
MSH Ausgabe (Write-host):
MSH_Position_4= WERT3 MSH_Position_6= WERT4 MSH_Position_7=201612230908
PV1 Ausgabe (Write-host):
PV1_Position_3=LAB PV1_Position_19=00000504970000

Wie man sehen kann, macht er die Reihenfolge bei MSH noch richtig. Bei PID und PV1 ist es jedoch leider verkehrt.
132272
Lösung 132272 10.02.2017 aktualisiert um 13:35:52 Uhr
Goto Top
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 ;-P
Du musst das ganze nur umdrehen face-wink > Hausaufgabe lieber Azubi face-smile

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('=')}}  
internet2107
internet2107 10.02.2017 um 13:42:20 Uhr
Goto Top
Danke Meister Eder, ich meine Meister Papier face-wink
Aktuell kann ich nicht testen, aber bis vor einer Stunde war der Groschen beim Azubi noch nicht gefallen.

In jedem Fall danke.
internet2107
internet2107 10.02.2017 um 18:16:03 Uhr
Goto Top
Alles perfekt. Danke.