browserlauser
Goto Top

In Textdateien String suchen und ersetzen

Hallo,

ich habe folgendes Problem. Ich habe ein Verzeichnis in dem viele verschiedene Dateien liegen. Darunter auch Textdateien.
Diese sind immer gleich aufgebaut und enthalten zweimal ein Datum ungefähr so:

Text
Text
ErstesDatum=01.01.2018
Text
Text
Text
Text
ZweitesDatum=20.08.2015
Text
...

Nun muss das Zweite Datum von unten das ErsteDatum oben ersetzen. Also als Ergebnis ungefähr so:

Text
Text
ErstesDatum=20.08.2015
Text
Text
Text
Text
ZweitesDatum=20.08.2015
Text
...

Das Ersetzen des Datums muss in allen diesen Dateien (insges. über 200.000) erfolgen.
Irgendwie bekomme ich das aber nicht hin. Würde mich über eure Hilfe freuen. Danke.

Content-Key: 454380

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

Printed on: April 25, 2024 at 05:04 o'clock

Member: Kraemer
Kraemer May 22, 2019 at 09:30:20 (UTC)
Goto Top
Moin,
Zitat von @Browserlauser:
ungefähr so:
ungefähr hilft ungefähr gar nicht. Poste bitte ein anonymisiertes 1:1-Beispiel

Das Ersetzen des Datums muss in allen diesen Dateien (insges. über 200.000) erfolgen.
an sich kein Problem, wenn der Aufbau der Datei das her gibt - siehe mein 1. kommentar

Irgendwie bekomme ich das aber nicht hin. Würde mich über eure Hilfe freuen. Danke.
klar. Zeig mal, was du bisher hast

Gruß
Member: Browserlauser
Browserlauser May 22, 2019 updated at 10:40:17 (UTC)
Goto Top
Hi,

die Datei sieht so aus:

[Info]
Indext=nein
Key=
Archivtyp=
ErstesDatum=14.05.2019
Format=5
Seiten=1
Erfasser=xyz
Schlagwort=
System=xyz
Name=xyz
ZweitesDatum=08.05.2014
Beleg=123456789
Personennummer=
Name=
Vorname=
Geburtsdatum=
Version=1

Ich würde das gern so lösen:

$Datum1 als Variable setzen
$Datum2 als Variable setzen

und dann Datum 1 mit Datum 2 ersetzen per:

get-ChildItem *.txt | Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {($Datum1.Replace,$Datum2)} | Set-Content $_}

Aber wie bekomme ich nur das Datum nach dem = in die Variable?
Member: Kraemer
Solution Kraemer May 22, 2019 at 11:37:30 (UTC)
Goto Top
Zitat von @Browserlauser:
get-ChildItem *.txt | Foreach-Object {Get-Content $_ | Out-String | Foreach-Object {($Datum1.Replace,$Datum2)} | Set-Content $_}

ganz so einfach geht das nicht face-wink

Get-ChildItem -Path "C:\temp\4" -Filter "*.txt" | ForEach-Object {  
    $FileName=$_.FullName
    $Document=Get-Content $FileName
    $Document | %{
        if ($_ -match "ErstesDatum=(\d{2}.\d{2}.\d{4})" -eq $true){  
            $ErstesDatum=$Matches[1]
        }
        if ($_ -match "ZweitesDatum=(\d{2}.\d{2}.\d{4})" -eq $true){  
            $ZweitesDatum=$Matches[1]
        }
    }
    $Document=$Document.replace("ErstesDatum=$ErstesDatum","ErstesDatum=$ZweitesDatum")  
    Set-Content -Value $Document -Path $FileName
}
Member: NetzwerkDude
Solution NetzwerkDude May 22, 2019 at 12:09:43 (UTC)
Goto Top
Falls man PowerShell5 (ab W10) oder Core (Multiplattform) hat:

#Alle Dateien einsammeln
$Files = Get-ChildItem "C:\pfad\zu\den\datein\"  

#den Code für jede Datei ausführen
foreach ($File in $Files) {

#Inhalt einlesen
    $Inhalt = Get-Content $File

#Muster 'irgendwelche buchstaben mehrfach, dannach ein gleich, dannach ein datum, wobei nur das Datum als match ansehen' suchen 
    $RegExPattern = '(?<=\w+\=)\d{2}\.\d{2}\.\d{4}'  

#Im Text nach nach Muster suchen
    $Result = [regex]::Matches($Inhalt, $RegExPattern)

#das erste vorkommen (0 = erster eintrag im array) des musters in die Variable ErstesDatum schreiben, das zweite vorkommen in ZweitesDatum schreiben
    $ErstesDatum = $Result.Value; $ZweitesDatum = $Result[1].Value

#Inhalt modifizieren, indem das erste vorkommen mit dem zweiten vorkommen ersetzt wird
    $Inhalt = $Inhalt -replace "$ErstesDatum","$ZweitesDatum"  

# den modifizierten inhalt zurück in die datei schreiben
    Set-Content -Path $File -Value $Inhalt
}

Der Code hat aber keinerlei fehlerhandling, also use with caution
Member: Browserlauser
Browserlauser May 22, 2019 at 12:16:47 (UTC)
Goto Top
Genial es funktioniert. face-smile) Besten Dank. Das hab ich mir dann vlt. doch etwas zu einfach gedacht. Aber so... perfekt
Member: Kraemer
Kraemer May 22, 2019 at 12:18:54 (UTC)
Goto Top
Zitat von @NetzwerkDude:
Der Code hat aber keinerlei fehlerhandling, also use with caution
Wenn es mal nur das wäre. Dein Ansatz geht davon aus, dass erstens die o.g. Reihenfolge eingehalten wird UND zweitens das Datum nur einmal in der Datei vorkommt.
Member: NetzwerkDude
NetzwerkDude May 22, 2019 at 12:27:08 (UTC)
Goto Top
mh, wir gehen ja beide von der Vorgabe des TO aus, und beide Codes gehen, also chill out man face-smile