markusboehm
Goto Top

Array befüllen jedoch Leere und Duplikate entfernen

Hallo,
ich habe nun einiges schon getestet und auch gesucht.
Ich möchte anhand einiger XML Dateien ein Array erstellen das soweit auch funktioniert.
Mir werden aber auch die Leeren IDs mitgenommen das ich eigentlich vermeiden wollte.
Zudem habe ich auch schon versucht duplikate per if-abfrage auszuschließen mit -imatch.
Jedoch jedesmal ohne erfolg.

    $bh = @()
    foreach($filebf in Get-ChildItem $target_zwischen_b -file -filter Project*.xml){  
        $xml = New-Object XML
        $xml.Load($filebf.Fullname)
            if( $xml.Data.Projektzeile.id -ieq "" -and $xml.Data.Projektzeile.id -imatch $bh){  
                 $bh += $xml.Data.Projektzeile.id
            }else{
            }
    }
    echo $bh
    echo $bh.count

Wo liegt mein gedankenfehler?

Beste Grüße Markus

Content-Key: 64236274787

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

Printed on: May 6, 2024 at 11:05 o'clock

Member: MarkusBoehm
MarkusBoehm Dec 21, 2023 updated at 09:32:49 (UTC)
Goto Top
Ich glaube, der fehler geht in die Richtung dass das vollständige XML eingelesen wird und er mir alle zutreffenden ID´s in eine Variable schreibt. Jetzt ist natürlich die Frage wie kann ich das umgehen?
Ausgabe beim aktuellen script
Array[0] von Projekt1.xml
null
null
0001
0001
0001
null
0002
0002

Array[1] von Projekt2.xml
0003
0010
0010
0010
null
null
0003
0005

und so weiter.
Member: DarkZoneSD
Solution DarkZoneSD Dec 21, 2023 updated at 09:52:23 (UTC)
Goto Top
Moin,

Wenn Du $null meinst, dann gilt: "You can have an array that contains one $null value and its count is 1 . But if you place an empty result inside an array then it's not counted as an item. The count is 0 . If you treat the empty $null like a collection, then it's empty." - Wenn Du 0 meinst, dann wäre vermutlich am einfachsten nach deinem foreach soetwas zu machen:
$Array = @(1, 2, 2, 3, 4, 0, 4, 5, 6, 6, 7)
echo $Array "Einmal mit allem :)"  
$Array = $Array | Where-Object { $_ -ne 0 } //oder $null
echo $Array "ohne 0"  
$Array = $Array | Select-Object -Unique
echo "Alle einzigartigen Werte"  
Mitglied: 10138557388
Solution 10138557388 Dec 21, 2023 updated at 10:01:05 (UTC)
Goto Top
null
Null als Text oder $null?
$bh = foreach($filebf in Get-ChildItem $target_zwischen_b -file -filter Project*.xml){  
    $xml = New-Object XML
    $xml.Load($filebf.Fullname)
    $xml.Data.Projektzeile.id
}
$bh = $bh | select -Unique | ?{$_ -ne 'null'}  
$bh
Pj
Member: MarkusBoehm
MarkusBoehm Dec 21, 2023 at 10:56:56 (UTC)
Goto Top
Zitat von @10138557388:

null
Null als Text oder $null?
$bh = foreach($filebf in Get-ChildItem $target_zwischen_b -file -filter Project*.xml){  
    $xml = New-Object XML
    $xml.Load($filebf.Fullname)
    $xml.Data.Projektzeile.id
}
$bh = $bh | select -Unique | ?{$_ -ne 'null'}  
$bh
Pj

habe es nun etwas umgeschrieben.
damit mir alles herausgefilteret wird:
$bh = $bh | select -Unique | ?{$_ -ne ""}  
$bh = $bh | select -Unique | ?{$_ -ne " "}  
$bh = $bh | select -Unique | ?{$_ -ne $null}

nun stoße ich aber an meine nächste grenze wo ich nicht verstehe warum dies nicht funktioniert.
ich habe folgenden textwert z.B. in
$bh[3] = XTX$(0:0-521464#0,0)
#echo gibt den wert auch richtig aus
wenn ich nun in einer weiteren xml abfrage folgendes eingebe oder reine if abfrage erhalte ich immer eine falsche rückmeldung:
if('XTX$(0:0-521464#0,0)' -notmatch $bh){  
    echo "kein Treffer" #das kommt  
}else{
    echo "Treffer" #das wäre aber richtig  
}
#if abfrage nur als sicherheitsabfrage bei mir gemacht um den fehler einzugrenzen
#eigentlich wollte ich folgendes machen
    foreach($bf in Get-ChildItem $target_c -file -filter Patient*.xml){  
        $xml = New-Object XML
        $xml.Load($bf.Fullname)
        $xml.Data.projekt | ?{($_.id -notmatch "$bh")} | %{$_.parentNode.removeChild($_)}    
        #hier der selbige fehler wie bei der if abfrage
        $xml.Save((Join-Path $target_c $bf.Name))  
    }
Mitglied: 10138557388
10138557388 Dec 21, 2023 updated at 11:44:08 (UTC)
Goto Top
Zitat von @MarkusBoehm:


habe es nun etwas umgeschrieben.
damit mir alles herausgefilteret wird:
$bh = $bh | select -Unique | ?{$_ -ne ""}  
$bh = $bh | select -Unique | ?{$_ -ne " "}  
$bh = $bh | select -Unique | ?{$_ -ne $null}

Viel zu umständlich, kannst du gleich alles in ein Where Object stecken
$bh = $bh | select -Unique | ?{$_ -notin ('',' ',$null)}    
$bh
Oder wenn die IDs nur aus Zahlen bestehen dürfen gleich so
$bh = $bh | select -Unique | ?{$_ -match '^\d+$'}    

-notmatch
-notmatch macht einen Regular Expressions Vergleich!!

-notin oder -contains ist dein Freund
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...


P.s. die eigentliche Frage des Threads ist beantwortet also bitte als gelöst markieren.