functionstrut
Goto Top

Werte vergleichen die nicht 100 Prozent gleich sind

Hallo,

gibt es eine Möglichkeit Ordnernamen oder einfach generell Texte oder Werte zu vergleichen auch wenn sie nicht 100%ig übereinstimmen?

Angenommen man hat folgende Sätze:

Berlin ist eine schöne Stadt 2010 xcv
Berlin ist eine schöne Stadt-dft

Das in diesem fall erkannt wird "oh hey, das ist im prinzip das gleiche nur das sich die Werte in x % unterscheiden.

geht sowas überhaupt?

Content-Key: 318162

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

Printed on: April 26, 2024 at 14:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Oct 18, 2016 at 15:39:53 (UTC)
Goto Top
Zitat von @functionstrut:

Hallo,

Hi

gibt es eine Möglichkeit Ordnernamen oder einfach generell Texte oder Werte zu vergleichen auch wenn sie nicht 100%ig übereinstimmen?


Ja

Angenommen man hat folgende Sätze:

Berlin ist eine schöne Stadt 2010 xcv
Berlin ist eine schöne Stadt-dft

Das in diesem fall erkannt wird "oh hey, das ist im prinzip das gleiche nur das sich die Werte in x % unterscheiden.

geht sowas überhaupt?

Ja

Stickwort: Strings vergleichen

https://www.windowspro.de/script/strings-powershell-ersetzen-vergleichen ...

Wenn du danach die % ausgeben willst, zähl die Zeichen mit und das ausrechnen der % sollte kein Problem sein. =)
Member: colinardo
colinardo Oct 18, 2016 updated at 15:46:45 (UTC)
Goto Top
Servus,
Stickwort: Strings vergleichen
ja nee, das richtige Verfahren dafür nennt sich Levenshtein-Distanz.

Eine Funktion für Powershell findest du hier:
Levenshtein Distance in Windows PowerShell

Grüße Uwe
Member: danielr1996
danielr1996 Oct 18, 2016 at 15:55:25 (UTC)
Goto Top
Versuchs mal mit Regex
Member: colinardo
colinardo Oct 18, 2016 updated at 16:15:33 (UTC)
Goto Top
Zitat von @danielr1996:
Versuchs mal mit Regex
Das funktioniert wenn man weiß welche Teile Anfang/Ende gleich sind face-wink, bei mehreren unterschiedlichen Namen sehr sehr aufwändig bis unmöglich, mit der Levenshtein-Distanz ist das wesentlich zuverlässiger, da man wirklich die max. Anzahl der Unterscheidungen egal an welcher Stelle des Strings festlegen kann.

Hier ein Beispiel mit dem Levenshtein Algorithmus:
function Get-StringDifferences{
    param([string] $first, [string] $second, [switch] $ignoreCase)
    $cost = 0
    $l1 = $first.length
    $l2 = $second.length
    if($l1 -eq 0){return $l2}
    if($l2 -eq 0){return $l1}
   
    if($ignoreCase.IsPresent){
        $first = $first.tolowerinvariant()
        $second = $second.tolowerinvariant()
    }

    $distance = new-object -type 'int[,]' -arg ($l1+1),($l2+1)  
    0..$l1 | %{$distance[$_,0] = $_}
    0..$l2 | %{$distance[0,$_] = $_}
 
    for($r = 1; $r -le $l1;$r++){
        for($c = 1; $c -le $l2;$c++){
            $cost = @{$true=0;$false=1}[($second[$c-1] -ceq $first[$r-1])]
            $tmin = [System.Math]::Min(([int]$distance[($r-1),$c]+1) , ([int]$distance[$r,($c-1)]+1))
            $distance[$r,$c] = [System.Math]::Min($tmin, ([int]$distance[($r-1),($c-1)] + $cost))
        }
    }
    return $distance[$l1, $l2];
}

$s1 = 'Berlin ist eine schöne Stadt 2010 xcv'  
$s2 = 'Berlin ist eine schöne Stadt-dft'  

Write-Host "Anzahl der Unterschiede:"  
Get-StringDifferences $s1 $s2 -ignoreCase