zzaaiiggaa
Goto Top

Powershell - PDF - String - Durchsuchen?

Hallo zusammen,

vielen Dank für die Hilfe die ich hier bereits erhalten habe!


Es werden PDFs eingelesen und diese sind als String vorhanden.
Nun prüfe ich bereits einige wenige Daten mit "-match" oder "-contains".

Jedoch möchte ich nun etwas genauer und etwas "mehr" Daten aus dem File ziehen (die Files sind immer gleich aufgebaut).
Also sowas wie zb.: Datum, Betrag, Rechnungsnummer etz. die Werte sind mir nicht bekannt, aber ich weiß welche Buzz Words davor stehen.

Für den Anfang würde auch folgendes reichen:
$string = "asdfasdfadf Datum: 23.06.2019 asdfasdfsafd asdfasdf"

if($string -contains "Datum:")
{
wie kann ich hier das Datum auslesen wenn ich weiß das es direkt das nächste "Wort" ist was von zwei (oder mehr) Leerzeichen umgeben ist?
Sozusagen face-smile wo ist der Zeiger auf das gefundene Element?
}


Gibt es dafür eine elegante Lösung?

Danke Gruß

Content-ID: 465440

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

Ausgedruckt am: 24.11.2024 um 10:11 Uhr

colinardo
Lösung colinardo 23.06.2019 aktualisiert um 18:01:21 Uhr
Goto Top
Gibt es dafür eine elegante Lösung?
Selbst verständlich, Regular Expressions ist bei solchen Dingen immer dein Freund.

Simples Beispiel mit der Verwendung der globalen $matches Variable die immer den Gesamtmatch und die Submatches des letzten Vergleiches mit dem -match Operator enthält
If ($string -match 'Datum:\s*([\d\.]+)'){  
    $datum = $matches[1]
    $datum
}
Im Beispiel ist das Datum als erster Submatch (Klammern um den Ausdruck) definiert und somit im Index 1 der $matches Variable verfügbar sofern der Match erfolgreich war. Man kann den Regen in vielen verschiedenen Varianten definieren und ihn z.B. auch ohne Submatch beschreiben womit nur das Datum selbst in den Gesamtmatch wandert
If ($string -match '(?<=Datum:\s*)[\d\.]+'){  
    $datum = $matches
    $datum
}
Diese Variante benutzt ein sogenanntes Positive Lookahead um das Datum zu finden, dabei wird das Präfix : Datum: jedoch nicht als Ergebnis mit einbezogen und somit wandert nur das reine Datum in den Gesamtmatch und wird deshalb mit Index 0 der $matches Variable abgefragt. Aber Lookaheads sind schon was für Regex Fortgeschrittene und Profis, damit will ich dich jetzt nicht gleich zu Beginn überfordern, fang erst mal klein an.

Regular Expressions ist sehr mächtig bedarf aber auch einiger Einarbeitungszeit, belohnt wirst du aber definitiv, denn Regex kannst du so gut wie in jeder Skript- und Programmiersprache anwenden und kannst damit Dinge extrahieren die du vorher nicht für möglich gehalten hättest!

Als Einsteig lohnt sich

https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/
https://ilovepowershell.com/2015/05/28/using-match-and-the-matches-varia ...

Nimm dir dafür am besten ein paar ruhige Stunden, wenn du es einmal kapiert hast willst du es sicherlich nie mehr missen.

Eine andere Variante wie man Regex in Powershell nutzen kann ist über das entsprechende .NET Objekt
$string = 'BlaBlub Datum: 10.01.2019 Blablub'  
$datum = [Regex]::match($string, '(?is)Datum:\s*([\d\.]+)').Groups[1].Value  

Und da gibt's noch viel viel viel mehr Methoden und Objekte die einem das Leben erleichtern. Ach nee, das lass ich jetzt mal, das würde Tage dauern 😜, genug geschrieben für Heute.
Zieh dir mal die diversen Powershell Tutorials und die Basis des .NET Frameworks rein dann erkennst du auch die Power der Shell.

Grüße Uwe
ZZaaiiggaa
ZZaaiiggaa 23.06.2019 um 18:00:55 Uhr
Goto Top
Was würde ich nur ohne dich machen colinardo!!! Vielen Dank !!!!
Es funktioniert alles so schnell und einfach mit deinen Beiträgen das ich schon fast am Ende bin.

Bis auf das letzte kann ich eigentlich alles auslesen:

Betrag: 1 212,00
Betrag: 0,00
Betrag: 111 124,00
Betrag: 1 112 124,00

Man hat einen Betrag der sich in der länge ändert und ebenfalls Leerzeichen enthält?


Viele Grüße!
colinardo
colinardo 23.06.2019 aktualisiert um 18:14:30 Uhr
Goto Top
Betrag: 1 112 124,00
Was willst du davon als Ergebnis haben? Nur das 124,00 oder alles inkl. der 1 112?
Wenn das letzteres dann
$string -match 'Betrag:\s*([ \d,]+)'  
Ergebnis ist im ersten Submatch und Daten mit Trim bei Bedarf nachbehandeln.
ZZaaiiggaa
ZZaaiiggaa 23.06.2019 aktualisiert um 18:15:30 Uhr
Goto Top
Vielen Dank! Ich kann den Ausdruck lesen verstehe jedoch nicht ganz was * macht? Dh. doch eigentlich beliebig oft?
Gruß
colinardo
colinardo 23.06.2019 aktualisiert um 18:19:24 Uhr
Goto Top
Steht in o.a. Tutorial. Das Sternchen matcht 0 oder mehr Zeichen des vorangegangenen Ausdrucks, indem Fall ein \s was bedeutet Whitespace Character.
Im Sinn bedeutet das obige \s* zwischen Betrag: und nachfolgendem Ausdruck: Es kann muss aber kein oder mehrere Leerzeichen oder Zeilenumbrüche, Tabs etc. stehen, Primär ist das hier dafür gedacht um schon den Whitespace zu Beginn zu entfernen. Könnte man aber auch hinterher mit einem Trim() erledigen.
ZZaaiiggaa
ZZaaiiggaa 23.06.2019 aktualisiert um 18:19:51 Uhr
Goto Top
Vielen Dank face-smile! Achso es bezog sich aufs Leerzeichen! Kapiert!
colinardo
colinardo 23.06.2019 um 18:20:15 Uhr
Goto Top
Keine Ursache face-wink. Schönen Rest-Sonntag wünsche ich dir.

Grüße Uwe