Inhalte vieler txt Dateien ändern
Hallo Forumsmitglieder,
aktuell stehe ich etwas auf dem Schlauch....
folgendes Problem
ich habe einige Tausend txt Dateien mit Protokollen.
Die Dateien befinden sich alle in einem Ordner.
In den Protokollen werden ungüstigerweise komplette Namen (Vorname Nachname) genannt.
Der Vorname Nachname soll in allen Protokolldateien abgeändert werden in "Mitarbeiter"
Mein Gedanke ist dies in Power Shell umzusetzen
sprich ich habe eine Datei mitarbeiter.dat in welcher die entsprechenden Mitarbeiter mit Vorname Nachname zeilenweise eingetragen sind
und das Script liest sich die Daten ein und ändert in allen Protoklldateien den entsprechenden Namen in "Mitarbeiter" ab.
Einzelnes Ändern würde zwar gehen,
Get-ChildItem *.txt | ForEach-Object {Get-Content $_ | Out-String | ForEach-Object {$_.Replace("Hans Meier","Agent")} | Set-Content $_}
aber es kommen auch immer noch rund 500 Namen in Betracht, welche in den Dateien stehen.
Klasse währe zudem eine Möglichkeit, nach dem Anpassen der Datei diese als neue Datei zu speichern
und wenn es in einer Datei keine Änderung gab, dies im Dateinamen zu vermerken.
Ich danke vielmals für eure Mithilfe
Chriss
aktuell stehe ich etwas auf dem Schlauch....
folgendes Problem
ich habe einige Tausend txt Dateien mit Protokollen.
Die Dateien befinden sich alle in einem Ordner.
In den Protokollen werden ungüstigerweise komplette Namen (Vorname Nachname) genannt.
Der Vorname Nachname soll in allen Protokolldateien abgeändert werden in "Mitarbeiter"
Mein Gedanke ist dies in Power Shell umzusetzen
sprich ich habe eine Datei mitarbeiter.dat in welcher die entsprechenden Mitarbeiter mit Vorname Nachname zeilenweise eingetragen sind
und das Script liest sich die Daten ein und ändert in allen Protoklldateien den entsprechenden Namen in "Mitarbeiter" ab.
Einzelnes Ändern würde zwar gehen,
Get-ChildItem *.txt | ForEach-Object {Get-Content $_ | Out-String | ForEach-Object {$_.Replace("Hans Meier","Agent")} | Set-Content $_}
aber es kommen auch immer noch rund 500 Namen in Betracht, welche in den Dateien stehen.
Klasse währe zudem eine Möglichkeit, nach dem Anpassen der Datei diese als neue Datei zu speichern
und wenn es in einer Datei keine Änderung gab, dies im Dateinamen zu vermerken.
Ich danke vielmals für eure Mithilfe
Chriss
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 220104
Url: https://administrator.de/forum/inhalte-vieler-txt-dateien-aendern-220104.html
Ausgedruckt am: 13.05.2025 um 16:05 Uhr
7 Kommentare
Neuester Kommentar
Hallo Chriss,
kein Problem wenn du mit zwei ineinander verschachtelten FOR-Schleifen arbeitest. Die äußere Schleife geht alle Dateien durch und die innere für jede Datei alle Namen:
In Zeile 1 musst du den Pfad und den Filter für deine Dateien angeben, Zeile 2 gibt den Ausgabepfad für die korrigierten Dateien an(ohne Slash am Ende) und in Zeile 3 gibst du die Datei an die die Namen enthält (einer pro Zeile).
Sollte in einer Datei einer oder mehrere der Namen gefunden werden werden diese durch "Mitarbeiter" ersetzt und die Datei wird durch den Anhang _corrected im Dateinamen ergänzt und im Zielordner abgespeichert. Wurde kein Name gefunden wird die Datei einfach so wie sie ist in den Zielordner kopiert.
Grüße Uwe
kein Problem wenn du mit zwei ineinander verschachtelten FOR-Schleifen arbeitest. Die äußere Schleife geht alle Dateien durch und die innere für jede Datei alle Namen:
In Zeile 1 musst du den Pfad und den Filter für deine Dateien angeben, Zeile 2 gibt den Ausgabepfad für die korrigierten Dateien an(ohne Slash am Ende) und in Zeile 3 gibst du die Datei an die die Namen enthält (einer pro Zeile).
$sourceFiles = dir "C:\Temp\source\*.txt" | ?{$_.PSIsContainer -eq $false}
$outdir = "C:\Temp\target"
$namesList = get-content "C:\temp\names.txt"
foreach($file in $sourceFiles){
$fcontent = gc $file.FullName
$found = $false
foreach($name in $namesList){
if ($name -ne "" -And $fcontent -cmatch $name){
$found = $true
$fcontent = $fcontent | %{$_.Replace($name,"Mitarbeiter")}
}
}
if ($found -eq $true){
$fcontent | Set-Content "$outdir\$($file.BaseName)_corrected$($file.Extension)" -Force
}else{
$file | Copy-Item -Destination $outdir -Force
}
}
Grüße Uwe
Hi,
kann man auch mit sed for Windows machen:
lg.
kann man auch mit sed for Windows machen:
sed -r "s#.*#s/\\<&\\>/MITARBEITER/g#" mitarbeiter.txt|sed -i.bak -f - protokoll*.lst
s. geänderter Code oben ... damit geht's auch in Powershell 2.0