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
22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

Mateusz Nadobnik

Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

read more