Powershell array.Indexof("string") will nicht
Hallo zusammen,
ich habe einen Emailtext, den ich umfangreich manipulieren muss, da die Sender sich da nicht so an die Konventionen halten können .
Bisher habe ich im Textbody oder htmlbody über Substring und index gesucht und alles gefunden, was ich immer so haben wollte.
Da ich aber endlich verstanden habe wie arrays funktionieren und wofür die so gut sein können, habe ich gedacht ich lese den Text ab jetzt in ein Array ein,
kann gezielt Zeilen manipulieren und alles zusammen in gleicher Reihenfolge wieder zurückschreiben
Nun möchte ich den Index mit "Kaufdatum" finden um diesen gezielt umzuschreiben, aber ich bekomme immer ein false zurück.
$test ist -1 die Originalzeile heißt auch "Kaufdatum 12-22-2019". Da ich nun aber nicht weiß, was hinter Kaufdatum so kommt müsste ich nach "Kaufdatum*" suchen, aber das geht auch nich...
Hilfe, bitte
Gruß Sascha
ich habe einen Emailtext, den ich umfangreich manipulieren muss, da die Sender sich da nicht so an die Konventionen halten können .
Bisher habe ich im Textbody oder htmlbody über Substring und index gesucht und alles gefunden, was ich immer so haben wollte.
Da ich aber endlich verstanden habe wie arrays funktionieren und wofür die so gut sein können, habe ich gedacht ich lese den Text ab jetzt in ein Array ein,
kann gezielt Zeilen manipulieren und alles zusammen in gleicher Reihenfolge wieder zurückschreiben
Nun möchte ich den Index mit "Kaufdatum" finden um diesen gezielt umzuschreiben, aber ich bekomme immer ein false zurück.
function rebuildDate()
{
$hmtlArray = $modTXT.Split("`n")
$test = $hmtlArray -match("Kaufdatum")
write-host $test
Write-Host "Ich bin eine Wartemarke"
}
$test ist -1 die Originalzeile heißt auch "Kaufdatum 12-22-2019". Da ich nun aber nicht weiß, was hinter Kaufdatum so kommt müsste ich nach "Kaufdatum*" suchen, aber das geht auch nich...
Hilfe, bitte
Gruß Sascha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 620767
Url: https://administrator.de/contentid/620767
Ausgedruckt am: 25.11.2024 um 10:11 Uhr
10 Kommentare
Neuester Kommentar
Moin,
Die .IndexOf()-Methode erfordert immer die gesamte exakte Zeile.
Ggfs, falls die Zeichenkette mehrfach vorkommt, solltest du den Matchstring noch mit Regex erweitern, da andernfalls nur der erste Fund berücksichtigt wird.
Eine andere Möglichkeit: Einfach den gesamten Array mit Regex-Replace abändern. So benötigst du den Index erst gar nicht.
Gruß Thomas
Die .IndexOf()-Methode erfordert immer die gesamte exakte Zeile.
$htmlArray.IndexOf($htmlArray -match 'Kaufdatum')
Eine andere Möglichkeit: Einfach den gesamten Array mit Regex-Replace abändern. So benötigst du den Index erst gar nicht.
Gruß Thomas
Zitat von @TK1987:
Eine andere Möglichkeit: Einfach den gesamten Array mit Regex-Replace abändern. So benötigst du den Index erst gar nicht.
Jepp, oder als weitere Alternative, da es ja sowieso schon in HTML ist und damit hervorragend von einem Parser verarbeitet werden kann dieses in ein DOM Object zu laden und dann mit den üblichen DOM-Methoden gezielt den Inhalt der Tags zu verändern und anschließend das generierte HTML wieder auszugeben, einfaches Beispiel:Eine andere Möglichkeit: Einfach den gesamten Array mit Regex-Replace abändern. So benötigst du den Index erst gar nicht.
$html = @'
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Das ist ein HTML Dokument</title>
</head>
<body>
<div id="elKaufdatum">BlaBlablub Text</div>
</body>
</html>
'@
$dom = New-Object -Com htmlfile
$dom.IHTMLDocument2_write($html)
$dom.getElementById('elKaufdatum').innerText = 'Neuer Text'
$dom.documentElement.innerHTML
Regex habe ich mir schon ein paar mal angeschaut, aber noch kapiere ich das nicht so wirklich. Habt Ihr da vielleicht einen Link zu einem (guten) Tutorial?
Das ist eigentlich sehr leicht verständlich zu lesen: Regular Expressions TutorialVermutlich schieße ich vom Knie durch den Bauch ins Auge^^
Definitiv!!
Nachdem du das von @146189 verlinkte Tutorial mal abgearbeitet hast...
Einfaches Beispiel:
Wir überprüfen deinen Raw-String mit -Match auf die gesuchte Regex-Zeichenfolge.
Wie du siehst, habe ich anschließend die Ausgabe mit Out-Null gelöscht. Wieso das?!
Match hat die besondere Eigenschaft, gefundene Zeichenfolgen in die Variable $Matches zu schreiben.
Wenn wir uns diese nun ansehen, finden wir dort auch unsere Gruppierungen wieder:
Hiermit können wir nun ganz leicht unser Datum so ausgeben lassen, wie wir es gerne hätten.
Nun brauchen wir nur noch das alte Datum durch das neue ersetzen
Zitat von @TheUnreal:
Salesdate kommt leider mal 3/15/2020 statt 03, also müssen wir auffüllen damit die Weiterverarbeitung passt.
Dafür hättest du deinen Raw-String gar nicht in ein Array zerlegen müssen.Salesdate kommt leider mal 3/15/2020 statt 03, also müssen wir auffüllen damit die Weiterverarbeitung passt.
Einfaches Beispiel:
$modTXT -Match 'Kaufdatum (\d+).(\d+).(\d+)' | Out-Null
Wie du siehst, habe ich anschließend die Ausgabe mit Out-Null gelöscht. Wieso das?!
Match hat die besondere Eigenschaft, gefundene Zeichenfolgen in die Variable $Matches zu schreiben.
Wenn wir uns diese nun ansehen, finden wir dort auch unsere Gruppierungen wieder:
PS C:\> $Matches
Name Value
---- -----
3 2020
2 15
1 3
0 Kaufdatum 3/15/2020
Hiermit können wir nun ganz leicht unser Datum so ausgeben lassen, wie wir es gerne hätten.
$Kaufdatum = get-date -day $Matches.2 -month $Matches.1 -year $Matches.3 -format 'yyyy-MM-dd'
$modTXT -Replace '(?<=Kaufdatum )\d+.\d+.\d+',$Kaufdatum
Zitat von @TheUnreal:
Nein, muss es nicht, weil es kein Punkt ist, sondern ein Platzhalter für ein beliebiges Zeichen...
Habe ich das korrekt verstanden?
Jup.Nein, muss es nicht, weil es kein Punkt ist, sondern ein Platzhalter für ein beliebiges Zeichen...
Habe ich das korrekt verstanden?
Wenn du willst, das wirklich nur Punkte zerlegt werden, müsstest du den Punkt escapen, also \. verwenden.
Gruß Thomas