Potrzebowałem skryptu który będzie usuwać wszystkie polskie znaki z danego ciągu, po dłuższej chwili… stworzyłem coś takiego:
$Polish = ą, ć, ę, ł, ń, ó, ś, ż, ź, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ż, Ź
$English = a, c, e, l, n, o, s, z, z, A, C, E, L, N, O, S, Z, Z
$ciag = (Chrząszcz brzmi w trzcinie w Szczebrzeszynie, W szczękach chrząszcza trzeszczy miąższ,
Czcza szczypawka czka w Szczecinie, Chrząszcza szczudłem przechrzcił wąż,
Strząsa skrzydła z dżdżu, A trzmiel w puszczy, tuż przy Pszczynie, Straszny wszczyna szum...)
foreach($litera in $ciag.toCharArray())
{
for($i=0; $i -lt 19; $i++)
{
if($litera.ToString().Equals($Polish[$i]))
{
$ciag=$ciag.Replace($Polish[$i],$English[$i])
}
}
} $ciag
Zastanawiam się czy idzie to napisać prościej, lepiej? Jakieś pomysły, propozycje?
Na pozbycie się polskich znaków jest prostszy w zapisie i przede wszystkich szybszy sposób. Liczby mówią wszystko, tak na szybko porównanie mojego skryptu z skryptem napisanym w komentarzu przez Kacpra za co wielkie dzięki 🙂
function Remove-DiactricChars1{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[string]$ciag
)
begin
{
$Polish = ą, ć, ę, ł, ń, ó, ś, ż, ź, Ą, Ć, Ę, Ł, Ń, Ó, Ś, Ż, Ź
$English = a, c, e, l, n, o, s, z, z, A, C, E, L, N, O, S, Z, Z
$Elapsed = [System.Diagnostics.Stopwatch]::StartNew()
}
process
{
foreach($litera in $ciag.toCharArray())
{
for($i=0; $i -lt 19; $i++)
{
if($litera.ToString().Equals($Polish[$i]))
{
$ciag=$ciag.Replace($Polish[$i],$English[$i])
}
}
}
}
end
{
$ciag
Write-Host ?Calkowity czas: $($Elapsed.Elapsed.ToString())?
}
}
Trzy próby dały wynik:
- Całkowity czas: 00:00:00.2308620
- Całkowity czas: 00:00:00.2129062
- Całkowity czas: 00:00:00.2629116
function Remove-DiactricChars{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
[string]$text
)
begin
{
$Elapsed = [System.Diagnostics.Stopwatch]::StartNew()
$chars = @{?ą?=?a?;?ć?=?c?;?ę?=?e?;?ł?=?l?;?ń?=?n?;?ó?=?o?;?ś?=?s?;?ż?=?z?;?ź?=?z?}
}
process
{
$chars.GetEnumerator() | ForEach-Object{
$text = $text -replace $_.Key, $_.Value}
}
end
{
$text
Write-Host ?Calkowity czas: $($Elapsed.Elapsed.ToString())?
}
}
Również trzy próby:
- Całkowity czas: 00:00:00.0312814
- Całkowity czas: 00:00:00.0367986
- Całkowity czas: 00:00:00.0326167