jobo10437
Goto Top

Vergleich von TXT-Dateien und Ausgabe identischer Begriffe

Hallo zusammen,

ich bin trotz meiner Recherchen im Netz bei meinem Problem nicht fündig geworden und suche auf diese Weise Hilfe.

Ich möchte mit Powershell eine große Annzahl von TXT-Dateien vergleichen.

Ausgangsbasis ist eine alphabetisch sortierte TXT-Liste (Wörterbuch als Goldstandard). Ich möchte aus einem Verzeichnis [NAME] mit 1-n Dateien (TXT), ebenfalls vorsortiert, gegen das Wörterbuch abgleichen. Die TXT ist aus einer OCR-Bearbeitung entstanden und ich möchte nur die im Wörterbuch erkannten Zeichenketten (Begriffe) speichern. Falls der Suchbegriff nicht im ersten Wörterbuch enthalten ist, würde idealer Weise gegen eine zweite Wörterbuchdatei geprüft werden. Hierdurch verspreche ich mir kürzere Suchzeiten.
Die Vergleichsdateien haben jeweils ca. 5000-8000 Begriffe (inkl. der falsch erkannten Zeichen).

Im Ergebnis sollen nur ganze Worte, die in beiden Dateien enthalten sind, in einer neuen TXT-Datei gespeichert werden, mit gleichem Namen wie die Ausgangsdatei, nur das Verzeichnis soll anders heißen (z.B. NAME-neu).

Datei 1 - Wörterbuch als Referenz:
Berlin
Freiburg
Hamburg
München
Osnabrück

Datei 2 - [eine von zig 1000 Vergleichsdateien mit OCR-Fehlern]:
Ber
Berlin
Hamburg
Osnabuck
Wisbaden

Ergebnis:
Berlin
Hamburg


Vielleicht hat jemand Spaß dran, mir zu helfen?
Vielen Dank für die Unterstützung!
Jobo

Content-ID: 2094408810

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

Ausgedruckt am: 24.11.2024 um 06:11 Uhr

em-pie
em-pie 08.03.2022 um 17:53:09 Uhr
Goto Top
Moin,

wenn mich nicht alles täuscht, brauchst du das Compare-Object() mit dem Parameter -ExcludeDifferent

Gruß
em-pie
1915348599
1915348599 08.03.2022 aktualisiert um 21:32:42 Uhr
Goto Top
$quelle = "d:\daten"  
$ziel = "d:\daten-neu"  
$wbuch1 = "d:\wörterbuch1.txt"  
$wbuch2 = "d:\wörterbuch2.txt"  
# -----
if(!(Test-Path $ziel)){md $ziel}
$wInhalt = Get-Content -Path $wbuch1,$wbuch2
foreach($file in Get-ChildItem $quelle -file -filter *.txt){
    Compare $winhalt @(Get-Content $file.Fullname) -IncludeEqual -ExcludeDifferent -Passthru | set-content "$ziel\$($file.Name)"  
}
Jobo10437
Jobo10437 10.03.2022 um 09:05:15 Uhr
Goto Top
Ein großes Dankeschön an Pretty. Einfach genial!
Mit Deinen 10 Zeilen ist mein Problem (fast) gelöst.

Ich habe gestern 200 TXT-Dateien abgeglichen. Hat 3 1/2 Stunden gebraucht. Und ich habe noch weitere 100.000 (!) TXT zu prüfen.
Ich will nun noch einmal testen, ob die Verschmelzung der Wörterbücher (ohne Dubletten) Zeit einspart. Es ist mir nicht klar, ob beim Vergleich gegen das Wörterbuch1 der Suchlauf im Wörterbuch2 entfällt, oder ob immer beide Referenzdateien durchsucht werden.

Ich melde mich wieder und berichte.

Zunächst einen schönen Tag
Jobo
Jobo10437
Jobo10437 14.03.2022 um 09:14:49 Uhr
Goto Top
Hallo zusammen,

ich habe inzwischen den Test mit einem "verschmolzenen" Wörterbuch (Wbuch1 + Wbuch2) durchgeführt. Jetzt hat der Suchlauf nur noch 2 Stunden benötigt. Das ist schon Mal ein satter Zeitgewinn.

Vielleicht hat jemand noch eine Idee wie der Abgleich noch effizienter durchgeführt werden könnte. Immerhin habe ich eine 6-stellige Anzahl an Dateien abzugleichen. Je kürzer der Suchlauf in einem Wbuch ist, desto eher sollte der Abgleich abgeschlossen sein.

Ich könnte mir vorstellen, dass zwei Suchschleifen die Lösung wären. Allerdings kenne ich mich damit überhaupt nicht aus. Nach meiner Vorstellung würde das so gehen:
1) Abgleich mit Wbuch1
2) Übereinstimmende Worte in Datei NEU speichern
3) Abzugleichende Datei um die Dubletten kürzen
4) verbleibende Worte gegen WBuch2 prüfen
5) Übereinstimmende Worte der Datei Neu hinzufügen
6) Datei Neu gem. Konvention umbenennen
7) Mit neuer Datei bei Schritt 1) fortfahren

Für jede Unterstützung bin ich dankbar.
Beste Grüße
Jobo
Jobo10437
Jobo10437 14.04.2022 um 13:24:32 Uhr
Goto Top
Der Vergleich einer vorsortierten Wortliste gegen ein Wörterbuch funktioniert, ist aber extrem langsam. Vermutlich wird A gegen B gesprüft und B gegen A.
Compare-Object (Get-Content $wortliste) (Get-Content $wbuch) -PassThru | where {$_.SideIndicator -eq "<="} | Set-Content -path $diff1
Sei es drum.

Nun habe ich die Worte, die nicht im Wörterbuch gefunden wurden (schmutzige OCR halt) separiert und in einer Exceldatei in 2 Spalten abgelegt. Spalte A die falschen Worte, in Spalte B die manuell korrigierten.
Nun möchte ich gern der vorsortierten Wortliste die falschen Begriffe in Excel suchen und durch den Wert aus Spalte B ersetzen.

Spalte A Spalte B
BetrlXf bleibt unkorrigiert
Betrog Betrog
Betrügen Betrügen
Beutachland Deutschland
Beutaehland Deutschland
Beutechen Deutschen
Beutsch Deutsch
Beutscnen Deutschen

Wie kann ich das mit PS realisieren?

Frohe Ostern!
Jobo