Dieser Blog Post ist wieder mal in Deutsch. Warum? Weil es um Umlaute der deutschen Sprache geht. Umlaute haben in der Informatik wenig zu suchen und machen auch deshalb Probleme beim Import von Daten aus anderen Datenquellen. In diesem Blogbeitrag zeige ich wie man Umlaute aus Textdateien und Excel bzw. CSV Dateien entfernt und umwandelt. Let’s jump in.
PowerShell ISE oder Visual Studio Code starten nicht vergessen. 😉
Der Basis-Code
Hier ist der Basis Code um Umlaute von einem String umzuwandeln. Verwendet wird die ().replace Methode in PowerShell.
$a = 'Ästher Österrücher' $a.Replace('ä','ae').Replace('Ä','Ae').Replace('ö','oe').Replace('Ö','Oe').Replace('ü','ue').Replace('Ü','Ue')
Cool. Nun kommen wir zum Advanced Thema.
Ersetzen von Umlauten in Text Dateien (*.txt)
Gegeben ist folgende Datei.
Der folgende Code wandelt alle Umlaute um und speichert das Ergebnis in einer neuen Datei im Profil des Benutzers.
$c = Get-Content $home\usernames.txt Foreach ($i in $c) { $newname = $i.Replace('ä','ae').Replace('Ä','Ae').Replace('ö','oe').Replace('Ö','Oe').Replace('ü','ue').Replace('Ü','Ue') Add-Content -Path $home\usernamescorrected.txt -Value $newname }
Ergebnis sieht so aus:
Was mich zum letzten Teil dieses Beitrags bringt …
Ersetzen von Umlauten in Excel Dateien (*.csv)
Gegeben ist folgende Datei.
Nun zum Code, welcher wieder alles ersetzt und die Ausgabe ein einer neuen Datei output.csv im Benutzerprofil speichert, auch solche Datensätze, die keine Umlaute aufweisen.
### Convert data in csv files # Get data from original file with Umlaute $originalfile = "$home\Umlaute_1.csv" $csv = Import-Csv $originalfile -Delimiter ';' # Create new csv file with headers Add-Content -Path $home\output.csv -Value "Vorname;Nachname" # Loop over each item to remove Umlaute and add content to newly created file foreach ($c in $csv) { If ($c -match '[ö,ü,ä,Ä,Ö,Ü]') { $given = $c.vorname.Replace('ä','ae').Replace('Ä','Ae').Replace('ö','oe').Replace('Ö','Oe').Replace('ü','ue').Replace('Ü','Ue') $sur = $c.nachname.Replace('ä','ae').Replace('Ä','Ae').Replace('ö','oe').Replace('Ö','Oe').Replace('ü','ue').Replace('Ü','Ue') $full = "$given;$sur" $full | foreach {Add-Content -Path $home\output.csv -Value $_} } else { $fullc = "$($c.Vorname);$($c.Nachname)" $fullc | ForEach-Object {Add-Content -Path $home\output.csv -Value $_} } }
Was dann so aussieht:
Cool.
Bis zum nächsten Mal!
Categories: PowerShell
Sorry für´s zweimal schreiben, habe nicht gesehen das heute Morgen, das schon funktioniert hat mit dem Kommentar.
LikeLike
Hallo,
ich hätte eine kurze Frage, ist es auch möglich Ordner damit zu ändern? Habe nämlich ein foreach auf Subfolder und möchte dort die Umlaute entfernen / ersetzen. Nach dem o.g. Methode. Funktioniert jedoch leider nicht.
Hier mein Beispiel:
$sourcePath = …
$source = Get-ChildItem $sourcePath – Directory
foreach ($s in $source) {
$name = $s.name
$newName = $name.Replace(‘ä’,’ae’).Replace(‘Ä’,’Ae’).Replace(‘ö’,’oe’).Replace(‘Ö’,’Oe’).Replace(‘ü’,’ue’).Replace(‘Ü’,’Ue’)
Rename-Item … …
}
Wenn ich nach dem Replace $newName ausgebe, steht das Gleiche drin wie vorher auch. Habe auch schon statt $s.Name mal $s.Basename versucht, gleiches Ergebnis.
LikeLike
Hi,
Das müsste genauso funktionieren wie bei den Dateien. Es gibt keinen Unterschied. Es ist String Manipulation.
Lg
LikeLike
Hallo,
kurze Frage, wie würde das bei Ordnern funktionieren? Habe eine foreach Schleife auf einen Ordner und möchte alle Umlaute der Unterordner ersätzen, funktioniert leider aber nicht.
Beispiel:
$sourcePath = ….
$source = Get-ChildItem $sourcePath -Directory
foreach ($s in $source) {
$name = $s.Name
$newName = $name.Replace(‘ä’,’ae’).Replace(‘Ä’,’Ae’).Replace(‘ö’,’oe’).Replace(‘Ö’,’Oe’).Replace(‘ü’,’ue’).Replace(‘Ü’,’Ue’)
Rename-Item ….
}
Jemand eine Idee wie?
LikeLike