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 wo ist der Zeiger auf das gefundene Element?
}
Gibt es dafür eine elegante Lösung?
Danke Gruß
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 wo ist der Zeiger auf das gefundene Element?
}
Gibt es dafür eine elegante Lösung?
Danke Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 465440
Url: https://administrator.de/contentid/465440
Ausgedruckt am: 24.11.2024 um 10:11 Uhr
7 Kommentare
Neuester Kommentar
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
}
If ($string -match '(?<=Datum:\s*)[\d\.]+'){
$datum = $matches
$datum
}
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
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.
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.